【问题标题】:Multiple signals arriving at handler多个信号到达处理程序
【发布时间】:2015-06-15 19:30:37
【问题描述】:

我有一个主进程,它分叉了一些子进程。

每个孩子都会做某事并阻止自己。通过阻塞自己,每个子进程都会向父进程发送SICHLD 信号。

我还在主流程代码中声明了一个sigaction 操作,以捕获孩子们将发送的SIGCLHD

static struct sigaction action;
action.sa_handler = handler 
sigfillset(&(action.sa_mask));
sigaction(SIGCHLD, &action, NULL);

SIGCHLD 处理程序在调用时会检查哪个孩子发送了SIGCHLD 信号并为那个孩子做一些事情。

问题是,如果多个孩子同时发送信号会发生什么?假设孩子(1)发送了SIGCHLD。处理程序捕获它并且在他完成句柄之前,kid(2) 和kid(3) 都发送信号。处理完 child(1) 后,处理程序会针对每个信号运行,还是会忽略这些信号?

【问题讨论】:

标签: c signals sigaction


【解决方案1】:

SIGCHLD 有点特别,因为每个退出的孩子只会得到一个信号;这些信号与它们对应的子进程留下的相应僵尸/等待状态相关联。但一般来说,大多数信号只是标志,而不是队列。如果可能,最好不要使用SIGCHLD,而只需使用waitpid 并以其他方式跟踪子退出(例如,通过在poll 循环等中观察子管道上的EOF 状态)。

【讨论】:

  • 孩子进程在完成工作时不会退出,它只是将状态更改为“停止”。我已经在使用 waitpid 来查看哪个孩子将状态更改为“停止”。
  • 嗯,我不确定停止的确切规则,但我认为它们是相同的,除非可能在信号能够传递之前停止的进程恢复的情况。 .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
相关资源
最近更新 更多