2

我正在尝试waitpid()为子进程制作我的进程,但也要每隔一段时间打印一些东西。

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

我无法弄清楚的唯一部分是SIGALRM防止waitpid().

我查看了手册页并没有看到任何标志。

想法?

4

2 回答 2

1

如果waitpid()返回-1并且errno等于EINTR 就重新开始调用waitpid()

pid_t pid;

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

  ...
}

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

于 2016-05-02T17:01:53.457 回答
0

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

于 2016-05-02T17:01:14.420 回答