wait()除了使用繁忙等待或繁忙睡眠循环外,还有什么方法可以使用超时的系统调用?
wait()
我有一个fork本身的父进程和exec一个子可执行文件。然后,它等待孩子完成操作,以任何适当的方式获取其输出,然后执行进一步的处理。如果该过程在一定时间内未完成,则假定其执行超时,并执行其他操作。不幸的是,鉴于问题的性质,此超时检测是必需的。
fork
exec
没有等待超时的等待呼叫。
您可以做的是安装一个为SIGCHLD设置标志的信号处理程序,并使用select()实现超时。select()将被信号中断。
static volatile int punt; static void sig_handler(int sig) { punt = 1; } ... struct timeval timeout = {10,0}; int rc; signal(SIGCHLD, sig_handler); fork/exec stuff //select will get interrupted by a signal rc = select(0, NULL,NULL,NULL, &timeout ); if (rc == 0) { // timed out } else if (punt) { //child terminated }
如果您还有其他信号需要处理,则需要更多的逻辑