我正在尝试为子进程创建进程waitpid()
,但也会在每隔一段时间打印一些内容。
我目前的计划是安排itimer
,waitpid()
,处理SIGALRM
打印,并在waitpid()
完成时停止计时器。
我唯一无法理解的部分是阻止SIGALRM
中断waitpid()
。
我查看了手册页,但没有看到任何标记。
思想?
答案 0 :(得分: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
答案 1 :(得分:0)
你必须在调用waitpid()之前屏蔽信号,但是你的警报会被延迟直到解锁,或者你必须检查waitpid()返回值和errno for EINTR