防止 SIGALRM 中断 waitpid()

Prevent SIGALRM from interrupting waitpid()

我试图让我的进程 waitpid() 成为一个子进程,但也每隔一段时间打印一些东西。

我目前的计划是安排 itimerwaitpid()、处理 SIGALRM 打印,并在 waitpid() 完成时停止计时器。

我唯一想不通的是如何防止 SIGALRM 打断 waitpid()

我查看了手册页,没有看到任何关于此的标志。

想法?

要么你必须在调用 waitpid() 之前屏蔽信号,但是你的警报将被延迟直到解除阻塞,或者你必须检查 waitpid() return 值和 EINTR[=10= 的错误号]

如果 waitpid() returned -1errno 等于 EINTR 重新开始调用 waitpid().

pid_t pid;

while (((pid_t) -1) == (pid = waitpid(...)))
{
  if (EINTR == errno)
  {
    continue;
  }

  ...
}

或者(至少对于 Linux)在接收信号时 waitpid() 的 return 可以通过安装信号处理程序时设置的 SA_RESTART 标志来避免。有关更多信息,请参阅此处:http://man7.org/linux/man-pages/man7/signal.7.html