我想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()不提供此功能 怎么办呢?
谢谢!
答案 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)
在Linux上,它实现为eventfd(2)
。