所以我目前正在研究POSIX线程并用C语言编程。 我的讲师使用
sigset(int sigNumber, void* signalHandlerFUnction)
因为他的笔记不是世界上最好的,我不得不自己做一些研究,并且发现了一篇解释信号的好文章,但作者正在使用 signal()方法,接受相同类型的参数,sigNumber和指向信号处理函数的指针。
从我所看到的两种方法都接受相同的参数,基本上产生相同的结果。 我读到signal()是旧的而不是便携式的,所以 sigaction()更好。但实际的差异是什么?
答案 0 :(得分:4)
函数signal
,sigset
(及其亲属)和sigaction
都会建立或删除信号处理程序。
signal
是ISO C指定的这些函数中唯一的一个,因此也是最便携的,但它也是最有限的,其行为的关键方面是不明确的(例如,它是否建立信号中断阻塞系统调用)。
sigset
家族是POSIX的一部分,但现在已标记为过时。这些功能从未在跨平台上可靠地提供,并且没有解决signal
的所有欠范围问题。不要使用它们。
sigaction
在POSIX.1中,提供比任何其他选项更多的功能,并且其行为已明确指定,包括所有极端情况。如果可能的话应该使用它。由于它不在ISO C中,而是在POSIX.1-2001中,因此对于第一个订单,您可以在Windows的关键例外情况下随处使用它。但是,信号处理程序不应该在Windows上的所有中使用,因为它们不是那里的系统原语并且不能可靠地工作;我的理解是,应该使用structured exception handling和asynchronous procedure calls来代替,这取决于我们想要做什么。
您的讲师正在专门教授POSIX系统编程,因此他们应该更新他们的示例代码和讲座,仅参考sigaction
。他们真的应该涵盖sigprocmask
,sigtimedwait
和pselect
。
答案 1 :(得分:1)
信号用于安装信号处理程序或忽略信号。 sigaction是一个Posix函数,可以忽略信号或安装信号处理程序。 sigaction采用信号掩码,因此可以对多个信号进行操作,而信号则用于为一个信号安装信号处理程序。
见上一篇文章: What is the difference between sigaction and signal?
sigset由基于System V的Unix操作系统使用。