防止 SIGALRM 中断 waitpid()
Prevent SIGALRM from interrupting waitpid()
我试图让我的进程 waitpid()
成为一个子进程,但也每隔一段时间打印一些东西。
我目前的计划是安排 itimer
、waitpid()
、处理 SIGALRM
打印,并在 waitpid()
完成时停止计时器。
我唯一想不通的是如何防止 SIGALRM
打断 waitpid()
。
我查看了手册页,没有看到任何关于此的标志。
想法?
要么你必须在调用 waitpid() 之前屏蔽信号,但是你的警报将被延迟直到解除阻塞,或者你必须检查 waitpid() return 值和 EINTR[=10= 的错误号]
如果 waitpid()
returned -1
和 errno
等于 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
我试图让我的进程 waitpid()
成为一个子进程,但也每隔一段时间打印一些东西。
我目前的计划是安排 itimer
、waitpid()
、处理 SIGALRM
打印,并在 waitpid()
完成时停止计时器。
我唯一想不通的是如何防止 SIGALRM
打断 waitpid()
。
我查看了手册页,没有看到任何关于此的标志。
想法?
要么你必须在调用 waitpid() 之前屏蔽信号,但是你的警报将被延迟直到解除阻塞,或者你必须检查 waitpid() return 值和 EINTR[=10= 的错误号]
如果 waitpid()
returned -1
和 errno
等于 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