如果子进程被阻塞怎么办,如何停止父进程?
What if child process blocked, how to stop parent?
我必须 运行 我的进程按顺序排列,先是子进程,然后是父进程,如果子进程被阻止怎么办,如何停止父进程?
if ((pid = fork()) == -1) { /* create a child process */
perror("fork() failed\n");
exit(1);
}
if (pid == 0) {
/* child process */
func1(NULL);
fflush(stdout);
return 0;
} else {
/* parent process */
wait(NULL);
func2(NULL);
fflush(stdout);
}
根据您给出的评论:您不想在已阻止的 child 上停止 parent,这是由 wait()
完成的。相反,您不希望 parent 在 wait()
.
中被阻止
为此使用 waitpid()
。它接收第三个参数,其中可以包括 WNOHANG
。这将使 waitpid()
立即变为 return,而无需等待某些 child 改变其状态。但是,您需要实现某种循环,检查所需状态,可能还有超时。
有关更多信息,请参阅文档。
Aaand 作为活动 cpu-busy 循环的替代方法,在循环中执行 waitpid()
和 WNOHANG
超时,您应该更喜欢以这样的方式实现它cpu 免费。
不要从父级调用 wait
,而是启用 SIGCHLD
并使用计时器设置超时,然后调用 pause()
并等待和调度来自 pause()
信号的事件.如何做到这一点的一个例子甚至在 man 3 wait
.
同样,在 Linux 上,您可以使用 pidfd_open(pid, 0)
并在超时时调用 poll()
POLLIN
。
我必须 运行 我的进程按顺序排列,先是子进程,然后是父进程,如果子进程被阻止怎么办,如何停止父进程?
if ((pid = fork()) == -1) { /* create a child process */
perror("fork() failed\n");
exit(1);
}
if (pid == 0) {
/* child process */
func1(NULL);
fflush(stdout);
return 0;
} else {
/* parent process */
wait(NULL);
func2(NULL);
fflush(stdout);
}
根据您给出的评论:您不想在已阻止的 child 上停止 parent,这是由 wait()
完成的。相反,您不希望 parent 在 wait()
.
为此使用 waitpid()
。它接收第三个参数,其中可以包括 WNOHANG
。这将使 waitpid()
立即变为 return,而无需等待某些 child 改变其状态。但是,您需要实现某种循环,检查所需状态,可能还有超时。
有关更多信息,请参阅文档。
Aaand 作为活动 cpu-busy 循环的替代方法,在循环中执行 waitpid()
和 WNOHANG
超时,您应该更喜欢以这样的方式实现它cpu 免费。
不要从父级调用 wait
,而是启用 SIGCHLD
并使用计时器设置超时,然后调用 pause()
并等待和调度来自 pause()
信号的事件.如何做到这一点的一个例子甚至在 man 3 wait
.
同样,在 Linux 上,您可以使用 pidfd_open(pid, 0)
并在超时时调用 poll()
POLLIN
。