C 信号。信号()与信号集()?

gEd*_*ger 0 c unix posix signals ipc

所以我目前正在学习 C 语言中的 POSIX 线程和信号编程。我的讲师使用

sigset(int sigNumber, void* signalHandlerFUnction)
Run Code Online (Sandbox Code Playgroud)

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

从我可以看到的两种方法都接受相同的参数并基本上产生相同的结果。我读到 signal() 很旧而且不可移植,所以sigaction()更好。但实际的区别是什么?

zwo*_*wol 5

函数signalsigset(及其相关函数),和sigaction都建立或删除信号处理程序。

signal 是 ISO C 指定的这些函数中的唯一一个,因此是最可移植的,但它也是最受限制的,并且其行为的关键方面未指定(例如,它是否建立了中断阻塞系统调用的信号)。

sigset家族是 POSIX 的一部分,但现在已被标记为过时。这些功能从来都不是可靠的跨平台可用,并且没有解决所有规格不足的问题signal。不要使用它们。

sigaction在 POSIX.1 中,提供比任何其他选项更多的功能,并且它的行为是明确指定的,包括所有极端情况。如果可能,应该使用它。由于它不在 ISO C 中,而是在 POSIX.1-2001 中,因此首先您可以在任何地方使用它,但 Windows 除外。然而,信号处理程序不应该用在所有的Windows,因为他们没有系统的原语有不可靠工作; 我的理解是应该使用结构化异常处理异步过程调用,这取决于人们尝试做什么。

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