我试图使我的进程waitpid()的子进程,但也打印了每隔一段时间。
我目前的计划是安排一个itimer,waitpid(),处理SIGALRM打印,并在waitpid()完成时停止计时器。
我唯一搞不懂的部分是防止SIGALRM中断waitpid()。
我看过手册页,没有看到任何标志。
有什么想法?
发布于 2016-05-02 17:01:53
如果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-02 17:01:14
要么您必须在调用waitpid()之前屏蔽该信号,但随后您的警报将延迟到解除阻塞,或者您必须为EINTR检查waitpid()返回值和errno。
https://stackoverflow.com/questions/36987673
复制相似问题