簡體   English   中英

gcc 5編譯fork()返回父PID 0?

[英]does gcc 5 compile fork() return parent pid 0?

我正在linux mint(具有gcc 7.4.0)做作業,但是作業測試環境是ubuntu 16.04(具有gcc 5.4.0)

這是對fork的敬意,相關代碼是這樣的

pid_t pids[total_process_num], pid;
int run_process = 0;
while (run_process < total_process_num) {
    pids[run_process] = fork();
    if(pids[run_process] < 0){
        return -1;
    }
    else if(pids[run_process] == 0){
        break;      //child
    }
    else if(run_process == total_process_num){
        break;
    }
    run_process++;
}
printf("fork value and pid is %d, %ld\n", run_process,(long) pids[run_process]);

如果總進程數比我的環境多(如果是gcc 7.4生成執行文件),則此代碼打印為5

fork value and pid is 1, 0
fork value and pid is 0, 0
fork value and pid is 2, 0
fork value and pid is 5, 32766
fork value and pid is 4, 0
fork value and pid is 3, 0

在測試環境中(如果gcc 5.4生成執行文件)結果是

fork value and pid is 0, 0
fork value and pid is 1, 0
fork value and pid is 2, 0
fork value and pid is 5, 0
fork value and pid is 3, 0
fork value and pid is 4, 0

那么為什么會出現這種差異呢? 是因為gcc版本不同嗎? 我以為總是fork將父級返回值不為0,因為此結果在代碼下不起作用

if(pids [run_process]!= 0)父進程在gcc 7.4中而不是在5.4中輸入if語句,我不認為gcc 5.4不好,所以我想知道這個結果的原因

當父級執行printf() ,它將打印您從未分配給該數組的元素。

分配給pids[4]的循環的最后迭代。 run_process++;脫離循環,但父run_process++;執行run_process++; ,因此run_process現在為5 然后while()條件結束循環。

因此,父級嘗試打印pids[5] ,但這在循環期間從未分配。 打印未分配的值會導致未定義的行為,因此從不同的編譯器獲得不同的結果也就不足為奇了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM