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

问题描述 投票:1回答:1

假设我有以下代码:

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作为子进程;这是p1的孩子。所以“p0完成”将不会打印,直到p1完成等待它的孩子,p2。所以,我想真正的问题是wait()是否等待孩子的孩子,或者只是处理一个“一代”

c fork posix wait
1个回答
4
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.