我正在學習分叉行程和記憶體管理,我遇到了這段代碼:
#include <stdio.h>
#include <libc.h>
int main() {
for (int i = 0; i < 3; i) {
printf("*");
fflush(stdout);
fork();
}
return 0;
}
根據我的計算,它應該產生 7 個星:初始行程列印一個星(1 個星),分叉,現在我們有 2 個行程,每個行程都列印一個星(1 2 = 3),然后它們分叉,所以我們有 4 個行程,他們每個人都會列印一個星,然后在程式結束時死掉。
因此,我們應該得到 1 2 4 = 7 顆星。
但是,在某些運行期間,我只得到 6 顆星,如下面的螢屏截圖所示:

其他時候,當我運行程式時,一切都很好,我得到了預期的 7 顆星。
到目前為止,我在互聯網上搜索并沒有找到類似的東西。除錯也沒有幫助。
那么,什么會導致這種奇怪的行為,我該如何解決呢?
uj5u.com熱心網友回復:
從終端運行此代碼時,您會注意到您*在某些運行中丟失的內容根本沒有丟失,而是在程式完成后列印出來。
為了更好地理解,您可以在行程即將完成時列印 PID 而不是星號和附加行:
int main() {
for (int i = 0; i < 3; i) {
printf("pid %d\n", getpid());
fflush(stdout);
fork();
}
printf ("pid %d terminates\n", getpid());
return 0;
}
缺少 print(s) 的運行輸出將如下所示,表明在所有行程完成之前終端已經回傳:
pid 31241
pid 31241
pid 31241
pid 31242
pid 31241 terminates
pid 31243
pid 31244 terminates
pid 31242
pid 31245
pid 31242 terminates
pid 31246 terminates
pid 31247 terminates
pid 31245 terminates
user@machine:~/bla$ pid 31243 terminates
pid 31248 terminates
要解決此問題,您可以讓父行程在回傳之前等待其子行程 - 這將導致您的初始行程最后完成并防止終端在后臺仍有子行程運行時回傳:
while (wait(NULL) > 0);
printf ("pid %d terminates\n", getpid());
uj5u.com熱心網友回復:
但是,在某些運行期間,我只得到 6 顆星,......
其他時候,當我運行程式時,一切都很好,我得到了 7 顆星,如預期的那樣。
您無法控制實體列印星星的順序。write()(由 隱式呼叫fflush())的一個示例,以及程式末尾的fork()隱式可能是:exit()
instance 1: write() -> First star
instance 1: fork() -> New instance #2
instance 1: write() -> Second star
instance 2: write -> Third star
instance 2: fork() -> New instance #3
instance 1: fork() -> New instance #4
instance 1: write() -> Fourth star
instance 2: write() -> Fifth star
instance 2: exit()
instance 1: exit() -> Process #1 has finished
---- Process #1 does no longer exist ---
instance 3: write() -> Sixth star
instance 3: exit()
instance 4: write() -> Seventh star
instance 4: exit()
在示例中,列印了第六和第七顆星,但在第一個程序完成之后。
但是,程式的輸出被寫入某個“管道”或“虛擬終端”,您的文本編輯器或 IDE 會將輸出復制到螢屏上。
一旦“初始”程序(實體 #1)完成,您的 IDE 就會認為您的程式已完成并停止將資料復制到螢屏上 - 因此示例中的第六和第七顆星由您的程式撰寫,但它們不會被 IDE 復制到螢屏上。
他們每個人都會列印一個星星,然后在程式結束時死掉。
...首先,所有 4 個實體都分叉,然后 8 個實體結束。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/410337.html
標籤:
下一篇:為什么malloc16位元組對齊
