【问题标题】:C Signals. signal( ) vs sigset( )?C 信号。信号()与信号集()?
【发布时间】:2014-11-05 17:08:11
【问题描述】:

所以我目前正在研究 C 中的 POSIX 线程和信号编程。 我的讲师使用

sigset(int sigNumber, void* signalHandlerFUnction)

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

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

【问题讨论】:

标签: c unix signals posix ipc


【解决方案1】:

函数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

【讨论】:

    【解决方案2】:

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

    查看之前的帖子: What is the difference between sigaction and signal?

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

    【讨论】:

      猜你喜欢
      • 2015-08-19
      • 2011-12-19
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      相关资源
      最近更新 更多