wait() 调用会以可预测的顺序执行吗?
Will wait() calls be executed in a predictable order?
假设我有以下代码:
pid_t pid0, pid1;
pid0 = fork();
if (!pid0) {
pid1 = fork();
if (!pid1) { // p2
/* do something */
return;
} else { // p1
wait(NULL);
printf("p1 done\n");
return;
}
}
// p0
wait(NULL):
printf("p0 done\n");
打印语句的顺序是确定的,还是取决于 CPU 的意愿?实际上,似乎每次都是一样的,但是 wait()
的文档让它看起来应该是随机的。
编辑:我已经考虑了更多,我想知道它是否总是按这个顺序,因为 p0 没有 p2 作为 child 进程;那是 p1 的 child。所以 "p0 done" 在 p1 完成等待它的 child 之前不会打印,p2。所以,我想真正的问题是 wait()
是等待 children 的 children,还是只处理一个 "generation" 离开
进程 0 将始终等待进程 1,因为这是它唯一的子进程。
进程 1 将始终等待进程 2,因为这是它唯一的子进程。
在进程 1 退出之前,进程 0 不会从 wait
return,这意味着进程 1 已经打印了它的消息,因为它在退出之前就已经打印了。
所以在这种情况下,进程 0 不能继续,直到消息被打印出来。
假设我有以下代码:
pid_t pid0, pid1;
pid0 = fork();
if (!pid0) {
pid1 = fork();
if (!pid1) { // p2
/* do something */
return;
} else { // p1
wait(NULL);
printf("p1 done\n");
return;
}
}
// p0
wait(NULL):
printf("p0 done\n");
打印语句的顺序是确定的,还是取决于 CPU 的意愿?实际上,似乎每次都是一样的,但是 wait()
的文档让它看起来应该是随机的。
编辑:我已经考虑了更多,我想知道它是否总是按这个顺序,因为 p0 没有 p2 作为 child 进程;那是 p1 的 child。所以 "p0 done" 在 p1 完成等待它的 child 之前不会打印,p2。所以,我想真正的问题是 wait()
是等待 children 的 children,还是只处理一个 "generation" 离开
进程 0 将始终等待进程 1,因为这是它唯一的子进程。 进程 1 将始终等待进程 2,因为这是它唯一的子进程。
在进程 1 退出之前,进程 0 不会从 wait
return,这意味着进程 1 已经打印了它的消息,因为它在退出之前就已经打印了。
所以在这种情况下,进程 0 不能继续,直到消息被打印出来。