繁体   English   中英

使用printf检查过程控制

[英]Checking process control using 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,如果counter == 0并且WEXITSTATUS都输出0,那么counter最终将为0?

我几乎可以肯定,最后一个print语句的结果是不确定的,但是从本质上讲,您永远不会得到零,因为counter永远不会为零,因为孩子永远不会返回零。 如果counter为零,那么它就不会叉出来。

在计数器4、2和1中,该fork被调用了3次。由于在counter/=2;之后没有printf语句,所以不打印0 counter/=2; 并且while循环最终在计数器变为0后退出。

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

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

输出应为7。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM