【问题标题】:Catching SIGCHLD with sigaction用 sigaction 捕获 SIGCHLD
【发布时间】:2017-10-23 22:33:36
【问题描述】:

我正在阅读一篇关于信号的文章,我不确定这部分代码在做什么。有人可以为我解释一下吗?本文是关于创建 TCP 畅通服务器的。

struct sigaction sigchldAction;
sigchldAction.sa_handler = SIG_IGN;
sigchldAction.sa_flags = 0;
sigemptyset(&sigchldAction.sa_mask);
if (sigaction(SIGCHLD, &sigchldAction, NULL) == -1) callError("sigaction()");

【问题讨论】:

  • 听起来你已经知道代码的作用了。有什么问题?
  • 我不确定为什么 sa_handler 中有 SIG_IGn。
  • @user3463055 这是对特殊地址值的定义(如NULL,但不同(我的系统上的0x1))。内核会注意到它并将其解释为忽略信号的命令。

标签: c signals fork


【解决方案1】:

根据sigaction的Linux手册页:

POSIX.1-1990 不允许将 SIGCHLD 的操作设置为 SIG_IGN。 POSIX.1-2001 允许这种可能性,因此忽略 SIGCHLD 可用于防止僵尸的创建(参见 等待(2))。

也就是说,使用SIG_IGN 显式忽略SIGCHLD 会导致操作系统在终止时自动销毁子进程,因此您不必为它们使用wait*。这通常是您想要的,尽管有时并非如此,因为它还阻止父进程使用wait* 来确定子进程的退出状态。

【讨论】:

  • 那么用这部分代码,我会破坏子进程吗?我认为要销毁子进程,我必须使用 wait()。
  • @user3463055 就像我说的,它会导致操作系统自动销毁子进程,因此父进程不需要调用wait*。我的回答不够清楚吗?
猜你喜欢
  • 2017-03-28
  • 1970-01-01
  • 2013-06-05
  • 2021-03-24
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
相关资源
最近更新 更多