C语言 使用 printf 检查过程控制



考虑以下 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 不是吗?

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

计数器 4、2 和 1 调用 fork 三次。并且没有打印 0,因为 counter/=2; 后没有 printf 语句,while 循环最终在计数器获得 0 后退出。

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

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

输出应为 7。

最新更新