亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

fork()分支比預期更多?

fork()分支比預期更多?

C++ C
眼眸繁星 2019-11-25 13:52:09
考慮以下代碼:#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main(void){    int i;    for(i = 0; i < 2; i++)    {        fork();        printf(".");    }    return 0;}該程序輸出8個點。那怎么可能呢?應該不應該有6個點?
查看完整描述

3 回答

?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

fork()原始常常延伸的想象力。在您對它有所了解之前,應該在紙上找出每個操作的含義并說明處理的數量。不要忘記fork()創建了當前進程的近乎完美的副本。(對于大多數用途而言)最重要的區別是,fork()父級和子級的返回值不同。(由于此代碼忽略了返回值,因此沒有區別。)

因此,起初只有一個過程。這將創建第二個過程,這兩個過程都將打印點和循環。在第二次迭代中,每個進程都會創建另一個副本,因此有四個進程先打印一個點,然后退出。因此,我們可以輕松地說明六個點,就像您期望的那樣。

但是,printf()真正的作用是緩沖其輸出。因此,只有兩個進程時的第一個點在寫入時不會出現。這些點保留在緩沖區中,該緩沖區在fork()中重復。直到該過程即將退出時,才會出現緩沖點。四個過程打印一個緩沖點,新的過程給出8個點。

如果您想避免這種情況,請fflush(stdout);在之后致電printf()


查看完整回答
反對 回復 2019-11-25
?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

您在輸出流中有未提交的緩沖區。stdout是行緩沖的,緩沖區與其余過程一起復制。程序終止時,未提交的緩沖區被寫入兩次(每個進程一次)。兩者都使用


printf("a\n");


printf("a "); fflush(stdout);

不要表現出問題。


在第一個示例中,您創建了四個進程,每個進程的輸出流緩沖區中都有兩個點。當每個流終止時,它將刷新其緩沖區,生成八個點。


查看完整回答
反對 回復 2019-11-25
?
拉風的咖菲貓

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點。:)


查看完整回答
反對 回復 2019-11-25
  • 3 回答
  • 0 關注
  • 589 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號