如果子进程被阻塞怎么办,如何停止父进程?

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