一尘不染

是否存在设置超时的wait()系统调用版本?

linux

wait()除了使用繁忙等待或繁忙睡眠循环外,还有什么方法可以使用超时的系统调用?

我有一个fork本身的父进程和exec一个子可执行文件。然后,它等待孩子完成操作,以任何适当的方式获取其输出,然后执行进一步的处理。如果该过程在一定时间内未完成,则假定其执行超时,并执行其他操作。不幸的是,鉴于问题的性质,此超时检测是必需的。


阅读 236

收藏
2020-06-03

共1个答案

一尘不染

没有等待超时的等待呼叫。

您可以做的是安装一个为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
}

如果您还有其他信号需要处理,则需要更多的逻辑

2020-06-03