是否会以可预测的顺序执行wait()调用?

时间:2019-02-13 22:32:30

标签: c fork posix wait

假设我有以下代码:

Fraction func() {
    double a = 1.0, b = 2.0;
    Fraction f = Fraction(int64_t(a), int64_t(b)); //this also works!!! 
    return f;
}

打印语句的顺序是确定的,还是取决于CPU的意愿?在实践中,每次似乎都相同,但是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"); 的文档似乎应该是随机的。

编辑:我已经考虑了很多,我想知道它是否始终按此顺序进行,因为p0没有将p2作为子进程;因此,那是p1的孩子。因此,直到p1等待其子级p2结束,才会打印“ p0完成”。因此,我想真正的问题是wait()是在等待孩子的孩子,还是只处理一个“世代”

1 个答案:

答案 0 :(得分:4)

进程0将始终等待进程1,因为这是它唯一的子进程。 进程1将始终等待进程2,因为那是它唯一的孩子。

直到进程1退出,进程0才从wait返回,这意味着进程1已经打印了它的消息,因为它在退出之前就已经这样做了。

因此,在这种情况下,直到消息打印完成后,进程0才能继续。