不使用 wait() 等待子进程

ste*_*ade 3 c multithreading

使用时fork(),是否可以确保子进程在父进程之前执行而不wait()在父进程中使用?


这与操作系统进程 API 章节中的作业问题有关:三件简单的作品,一本免费的在线操作系统书籍。

问题说:

  1. 使用fork(). 子进程应该打印“hello”;父进程应该打印“再见”。你应该尽量确保子进程总是先打印;你可以在打电话wait()给父母的情况下做到这一点吗?

这是我使用的解决方案wait()

#include <stdio.h>
#include <stdlib.h> // exit
#include <sys/wait.h> // wait
#include <unistd.h> // fork

int main(void) {
    int f = fork();
    if (f < 0) { // fork failed
        fprintf(stderr, "fork failed\n");
        exit(1);
    } else if (f == 0) { // child
        printf("hello\n");
    } else { // parent
        wait(NULL);
        printf("goodbye\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

想了想,我决定最后一个问题的答案是“不,你不能”,但后来的问题似乎暗示你可以:

  1. 现在编写一个程序,用于wait()等待子进程在父进程中完成。什么wait()回报?如果你wait()在孩子身上使用会发生什么?

我对第二个问题的解释有误吗?如果不是,你怎么做第一个问题?如何在不使用wait()父级的情况下先让子打印?

陳 力*_*陳 力 5

我希望这个答案对某人来说还不算晚。

几分钟前,我给 Remiz(这本书的作者)发了邮件,得到了这样的回放(摘录了一些片段):

不调用 wait() 很难,而且不是真正的重点。你所做的——自己学习信号——是一个好兆头,表明你会寻求更深入的知识。对你有益!

稍后,您将能够使用共享内存段以及条件变量或信号量来解决此问题。

他是一位非常负责任的教育家、作家和教授:P


o11*_*11c 4

在父级中创建一个管道。之后fork,关闭父级中的写入部分和子级中的读取部分。

然后,poll为了可读性。由于子进程永远不会写入它,因此它将等到子进程(以及所有孙子进程,除非您特别小心)不再存在,此时poll将给出“read withhangup”响应。(或者,您实际上可以通过管道进行通信)。

您应该阅读有关O_CLOEXEC. 作为一般规则,除非您有充分的理由清除该标志,否则应始终设置该标志。

  • @hoholee12 呃,和其他时候一样吗?您读过[手册页](https://www.man7.org/linux/man-pages/man2/poll.2.html)吗? (2认同)