等待子进程不超过X秒

时间:2014-03-31 18:39:56

标签: c fork

我想fork()一个子进程然后调用execl()来替换子进程映像,使用一个可能不会停止的新进程(将陷入while循环或者预期输入不应该例如)。
我想等待它不超过X秒 看起来应该是这样的:

int main() {

    pid_t pid=fork();
    if (pid==-1) {
        perror("fork() error");
    }
    else if (pid==0) {
        //call execlp("exe.out","exe.out",arg1, ... ,NULL)
        //where exe.out might not stop at all
    }
    else {
        //wait for X seconods, and if child process didn't terminate
        //after X seconds have passed, terminate it
    }
}

wait()和waitpid()不提供此功能 怎么办呢?

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以将信号处理程序警报设置为在X秒后关闭,然后执行等待(2)。如果等待返回,则子状态在X秒之前改变。如果信号处理程序返回,则不会更改子状态。

如果等待(2)返回,请不要忘记重置警报。

答案 1 :(得分:0)

如果没有收到来自pid进程在超时之前结束的父进程的信号(伪代码),你可以再创建一个杀死pid进程的子进程:

in_, out = pipe()
pid2 = fork()
if pid2 != 0: # parent
   close(in_)
   waitpid(pid, 0) # wait for child to complete
   write(out, b'1') # signal to pid2 child to abort the killing
   waitpid(pid2, 0)
else: # child
   close(out)
   ready, _, _ = select([in_], [], [], timeout) # wait `timeout` seconds
   if not ready: # timeout
      kill(pid, SIGTERM)
      write(2, b"kill child")
   else:
      write(2, b"child ended before timeout")
   _exit(0)

这是complete code example

在Linux上,它实现为eventfd(2)