C信号。 signal()vs sigset()?

时间:2014-11-05 17:08:12

标签: c unix signals posix ipc

所以我目前正在研究POSIX线程并用C语言编程。 我的讲师使用

sigset(int sigNumber, void* signalHandlerFUnction)

因为他的笔记不是世界上最好的,我不得不自己做一些研究,并且发现了一篇解释信号的好文章,但作者正在使用 signal()方法,接受相同类型的参数,sigNumber和指向信号处理函数的指针。

从我所看到的两种方法都接受相同的参数,基本上产生相同的结果。 我读到signal()是旧的而不是便携式的,所以 sigaction()更好。但实际的差异是什么?

2 个答案:

答案 0 :(得分:4)

函数signalsigset(及其亲属)和sigaction都会建立或删除信号处理程序。

signal是ISO C指定的这些函数中唯一的一个,因此也是最便携的,但它也是最有限的,其行为的关键方面是不明确的(例如,它是否建立信号中断阻塞系统调用)。

sigset家族是POSIX的一部分,但现在已标记为过时。这些功能从未在跨平台上可靠地提供,并且没有解决signal的所有欠范围问题。不要使用它们。

sigaction在POSIX.1中,提供比任何其他选项更多的功能,并且其行为已明确指定,包括所有极端情况。如果可能的话应该使用它。由于它不在ISO C中,而是在POSIX.1-2001中,因此对于第一个订单,您可以在Windows的关键例外情况下随处使用它。但是,信号处理程序不应该在Windows上的所有中使用,因为它们不是那里的系统原语并且不能可靠地工作;我的理解是,应该使用structured exception handlingasynchronous procedure calls来代替,这取决于我们想要做什么。

您的讲师正在专门教授POSIX系统编程,因此他们应该更新他们的示例代码和讲座,仅参考sigaction。他们真的应该涵盖sigprocmasksigtimedwaitpselect

答案 1 :(得分:1)

信号用于安装信号处理程序或忽略信号。 sigaction是一个Posix函数,可以忽略信号或安装信号处理程序。 sigaction采用信号掩码,因此可以对多个信号进行操作,而信号则用于为一个信号安装信号处理程序。

见上一篇文章: What is the difference between sigaction and signal?

sigset由基于System V的Unix操作系统使用。