關於fork多程序中printf的問題

2021-06-16 09:15:59 字數 1446 閱讀 2666

int main()    //輸出為hello worldhello world  int main()    //輸出為hello world 

printf是向標準輸出(stdout)輸出你要列印的東西,而預設的stdout是line buffering,也就是以行方式快取的,

所以當你列印的東西不夠一行(沒有\n)的時候,這些資訊是儲存在stdout的buffer中,然後你fork,

這樣父程序和子程序的stdout的buffer就都包含有你沒有列印出來的內容,當這兩個程序結束的時候,b

uffer中的內容會被列印出來,這樣你就看到了兩次 hello world. 而第二個程式中,你列印的東西夠了一行(有\n結束),

所以在fork之前,資訊就被列印出來了,

fork之後父程序和子程序stdout的buffer中都是空的了,

所以你就只看到一次hello world.

解決第乙個程式的問題的方法是 printf("hello world"); fflush(stdout); //手動將stdout快取的內容列印出來。 fork();

這是乙個簡單的 建立子程序,然後子程序各自執行 的程式

在看之前首先思考3個問題

(1)child1,child2是child的子程序麼?

(2)紅字部分程式會執行幾次?

(3)藍字部分程式會執行幾次?

#include

#include

#include

#include

#include

int main(woid)

else if(child1==0)

if(child2==-1)

else if(child2==0)

else

}while(child==0);

if(child==child2)

printf("get child2\n");

else

printf("error occured!\n"); }}

最終 紅字部分執行了4次,藍字部分執行了2次

程式本來有乙個程序child

child1=fork();

這句話創造了1個程序,child的子程序child1

child2=fork();

這句話創造了2個程序:

child的另外乙個子程序child2;

child1的乙個子程序child2(相當於包含了child1的內容)。

因為有4個程序,所以所有不需要條件判斷的輸出語句都會執行4次

藍子部分是由child的子程序child1,child1的子程序child2各執行了一次,所以是2次

gdb 子程序 多程序 fork 除錯

標 題 faq 請問如何用gdb除錯子程序 發信站 bbs 水木清華站 mon may 19 18 17 02 2003 轉信 作個faq,在常見的x86平台上如何gdb除錯fork或者exec出來的子程序 1.在fork語句上設定斷點,修改fork返回的值。這種做法並沒有真正去 觸動已經存在的子程...

Linux中關於fork 複製程序

fork 複製程序1 fork 的基本概念 乙個現有程序可以用fork 函式通過系統呼叫建立乙個新程序,該函式定義如下 include pid t fork void 返回 若成功則在子程序中返回0,在父程序中返回子程序pid,若出錯則返回 1 因此,可以通過返回值知道當前程序是父程序還是子程序。2...

程序的基本操作,fork(),建立多程序。

fork用於新建乙個子程序,簡單的例子 include 提供open函式 include 該標頭檔案提供系統呼叫的標誌 include 該標頭檔案提供系統狀態資訊和相關函式 include 該標頭檔案提供程序i o操作的相關函式 include 標準函式庫 include 檔案操作相關函式庫 inc...