簡體   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