使用printf检查过程控制

时间:2014-12-10 22:17:16

标签: c process fork

考虑以下C代码:

int main(){
    pid_t pid;
    int status, counter = 4;

    while(counter > 0){
        pid = fork();

        if (pid){
            counter/=2;
        }

        else{
            printf("%d", counter);
            break;
        }
    }
    if (pid){
        waitpid(-1, &status, 0);
        counter += WEXITSTATUS(status);

        waitpid(-1, &status, 0);
        counter += WEXITSTATUS(status);

        printf("%d", counter);
    }
    return counter;
}

所有进程都运行完成,printf是原子的,在打印参数后但在返回之前调用fflush(stdout)。

列出对printf的调用可以发出的个别数字。

正确答案是1 2 3 4 5 6。

然而,我不明白为什么。 首先,WEXITSTATUS的可能输出是什么?如果所有进程都运行完成,那么它是否总是等于0?另外,为什么0不是可能的输出?如果计数器== 0且WEXITSTATUS都输出0,那么计数器最终会为0吗?

2 个答案:

答案 0 :(得分:1)

我几乎可以肯定结果对于最后一个打印语句是不确定的,但基本上你永远不会得到零,因为计数器永远不会为零,因为孩子永远不会返回零。如果计数器为零,那么它就不会在第一时间分叉。

答案 1 :(得分:0)

对于计数器4,2和1,fork被调用三次。由于在printf之后没有counter/=2;语句,并且while循环最终退出,因此不打印0计数器得到0.

WEXITSTATUS的可能输出可以是4,2,1和0.但是只有两个waitpid,第二个printf的输出应该是6,因为有只有两个waitpid调用只等待4和2.因此第二个printf的输出应为6.如果再添加一个

waitpid(-1, &status, 0);
counter += WEXITSTATUS(status);

输出应为7。