当已经在信号处理程序中时接收到信号会发生什么?

本杰明:

我有一个父进程产生了几个子进程。我想知道何时通过注册SIGCHLD信号处理程序退出任何子进程

问题是,如果SIGCHLD父进程已经在信号处理程序中,而又收到另一个(或任何其他信号),会发生什么

我可以想到以下结果:

  • 信号被忽略
  • 信号已排队,当前处理程序返回后将立即进行处理
  • 就像主程序一样,当前的处理程序又被中断了

哪一个是正确的?

达蒙(Damon):

在您的具体示例中(接收到相同的信号),信号在信号处理程序完成之后被传递(因此,项目要点2是正确的)。但是请注意,您可能会“丢失”信号。

这样做的原因是,当信号在其处理程序中时,它被阻止了。被阻止的信号被设置为未决,但未排队。术语“待定”表示操作系统记住有一个信号等待下一个机会传递,而“未排队”表示操作系统通过在某处设置标志来实现此目的,而不是通过保留有关如何执行的确切记录来进行。许多信号已经到达。

因此,你可以更收到2或3(或10) SIGCHLD而在你的处理器,但只看到一个(所以在某些情况下,子弹点#1 可以是正确的,太)。

请注意,您可以传递的几个标志sigaction可能会影响默认行为,例如SA_NODEFER(防止阻塞信号)和SA_NOCLDWAIT(在某些系统上可能根本不产生信号)。

当然,现在,如果您收到其他类型的信号,则无法保证它不会中断您的处理程序。因此,最好不要使用非信号安全功能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当进程收到信号时,线程会发生什么?

如果修改信号处理程序中的ctx.rip和ctx.rsp会发生什么

尽管我已经在python ctypes中设置了信号处理程序,但它并未被调用

当subprocess.call收到终止信号时会发生什么?

使用信号处理程序处理从 fifo 接收到的数据

如果在取消点上调用信号处理程序,会发生什么情况?

在 bash 脚本中,当信号被捕获时会发生什么

在RTOS中释放或发出信号时会发生什么?

openCV中的KalmanFilter跟踪-程序接收到的信号SIGSEGV

如果我捕捉到SIGSEGV,并且信号处理程序导致了另一个SIGSEGV,会发生什么?

程序接收到信号SIGPIPE,管道损坏

SDL2&GDB:程序接收到信号?,未知信号

当段故障发生时未调用信号处理程序时?

在Bash中识别接收到的信号名称

如果信号线程被阻塞,为什么在接收线程中没有处理信号?

当用像 SIGINT 这样的信号中断 C 程序时会发生什么?

更改innerHTML属性时处理程序会发生什么

如果我在线程池中发布了工作并且线程已经在Boost中工作,会发生什么情况?

为什么信号处理程序中的waitpid需要循环?

Tableview 未接收到来自驱动程序的信号

我们什么时候需要在信号处理程序中再次建立信号函数?

为什么信号功能无法调用我的信号处理程序?

FigureCanvas 在接收到来自 Popup 的信号时无法出现

(为什么)提高复位信号处理程序?

为C中的任何信号设置信号处理程序

在go中添加另一个阻塞线程时,为什么信号处理程序不起作用?

在信号处理程序中遍历TAILQ

子线程中的信号处理程序

从信号处理程序中唤醒线程