[英]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.