【发布时间】:2016-06-11 17:43:15
【问题描述】:
我正在阅读一篇文章,我阅读了以下内容:假设我们要执行一个外部命令并等待它退出。我们不想永远等待,我们想设置一些超时时间,然后我们将杀死子进程。这该怎么做?要运行命令,我们使用 fork(2) 和 execve(2)。要等待特定进程退出,我们可以使用 waitpid(2) 函数,但它没有超时参数。我们还可以创建一个循环,在其中调用 sleep(3) 并将超时作为参数,并使用 sleep(3) 将被 SIGCHLD 信号中断的事实。该解决方案将起作用……几乎。它将包含一个竞争条件:如果进程立即退出,在我们调用 sleep(3) 之前,我们将等到超时到期。这是一场类似于前面描述的比赛。系统调用是如何中断的?子进程是向父进程还是系统调用 sleep(3) 发送信号?我不明白系统调用如何停止执行并传递给父进程,系统调用是否像另一个进程?
【问题讨论】: