3 回答

TA貢獻1821條經驗 獲得超5個贊
該fork()
原始常常延伸的想象力。在您對它有所了解之前,應該在紙上找出每個操作的含義并說明處理的數量。不要忘記fork()創建了當前進程的近乎完美的副本。(對于大多數用途而言)最重要的區別是,fork()
父級和子級的返回值不同。(由于此代碼忽略了返回值,因此沒有區別。)
因此,起初只有一個過程。這將創建第二個過程,這兩個過程都將打印點和循環。在第二次迭代中,每個進程都會創建另一個副本,因此有四個進程先打印一個點,然后退出。因此,我們可以輕松地說明六個點,就像您期望的那樣。
但是,printf()
真正的作用是緩沖其輸出。因此,只有兩個進程時的第一個點在寫入時不會出現。這些點保留在緩沖區中,該緩沖區在fork()中重復。直到該過程即將退出時,才會出現緩沖點。四個過程打印一個緩沖點,新的過程給出8個點。
如果您想避免這種情況,請fflush(stdout);
在之后致電printf()
。

TA貢獻1803條經驗 獲得超3個贊
您在輸出流中有未提交的緩沖區。stdout是行緩沖的,緩沖區與其余過程一起復制。程序終止時,未提交的緩沖區被寫入兩次(每個進程一次)。兩者都使用
printf("a\n");
和
printf("a "); fflush(stdout);
不要表現出問題。
在第一個示例中,您創建了四個進程,每個進程的輸出流緩沖區中都有兩個點。當每個流終止時,它將刷新其緩沖區,生成八個點。

TA貢獻1995條經驗 獲得超2個贊
當我= 0時
處理_1:緩沖的文本= 1點
Process_2(由Process_1創建):緩沖的文本= 1點
當我= 1
Process_3(由Process_1創建):從Process_1繼承1個緩沖點,并單獨打印1個點??偣睵rocess_3打印2個點。
Process_4(由Process_2創建):從Process_2繼承1個緩沖點,并自行打印1個點??偣睵rocess_4打印2個點。
Process_1:打印2個點(當i = 0時一個緩沖點,而i = 1時另一個緩沖點)
Process_2:打印2點(i = 0時一個緩沖點,i = 1時另一緩沖點)
最終輸出:8點。:)
- 3 回答
- 0 關注
- 589 瀏覽
添加回答
舉報