使用时fork(),是否可以确保子进程在父进程之前执行而不wait()在父进程中使用?
这与操作系统的进程 API 章节中的作业问题有关:三件简单的作品,一本免费的在线操作系统书籍。
问题说:
- 使用
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)
想了想,我决定最后一个问题的答案是“不,你不能”,但后来的问题似乎暗示你可以:
- 现在编写一个程序,用于
wait()等待子进程在父进程中完成。什么wait()回报?如果你wait()在孩子身上使用会发生什么?
我对第二个问题的解释有误吗?如果不是,你怎么做第一个问题?如何在不使用wait()父级的情况下先让子打印?
我希望这个答案对某人来说还不算晚。
几分钟前,我给 Remiz(这本书的作者)发了邮件,得到了这样的回放(摘录了一些片段):
不调用 wait() 很难,而且不是真正的重点。你所做的——自己学习信号——是一个好兆头,表明你会寻求更深入的知识。对你有益!
稍后,您将能够使用共享内存段以及条件变量或信号量来解决此问题。
他是一位非常负责任的教育家、作家和教授:P
在父级中创建一个管道。之后fork,关闭父级中的写入部分和子级中的读取部分。
然后,poll为了可读性。由于子进程永远不会写入它,因此它将等到子进程(以及所有孙子进程,除非您特别小心)不再存在,此时poll将给出“read withhangup”响应。(或者,您实际上可以通过管道进行通信)。
您应该阅读有关O_CLOEXEC. 作为一般规则,除非您有充分的理由清除该标志,否则应始终设置该标志。