3 回答

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

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

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