通過fork函式解讀linux系統行緩衝與全緩衝

2021-06-17 23:31:16 字數 1368 閱讀 5859

基於流的操作最終會呼叫read或者write函式進行i/o操作。為了使程式的執行效率最高,流物件通常會提供緩衝區,以減少呼叫系統i/o庫函式的次數。

1、全緩衝 。全緩衝指的是系統在填滿標準io緩衝區之後才進行實際的io操作;注意,對於駐留在磁碟上的檔案來說通常是由標準io庫實施全緩衝。

2、行緩衝 。在這種情況下,標準io在輸入和輸出中遇到換行符時執行io操作;注意,當流涉及終端的時候,通常使用的是行緩衝。

3、無緩衝 。無緩衝指的是標準io庫不對字元進行緩衝儲存;注意,標準出錯流stderr通常是無緩衝的。

fork函式:類unix系統中,乙個現有的程序可以呼叫fork函式建立乙個新的程序。由fork建立的新程序成為子程序(child process)。fork函式被呼叫一次,但是返回兩次。兩次返回的唯一區別是子程序的返回值是0,而父程序的返回值則是新子程序的程序id。子程序和父程序分別繼續執行fork呼叫之後的命令。子程序獲得父程序資料空間、堆、棧(以及io緩衝區)的副本,父子程序共享正文段。

下面是聖經(unix高階環境程式設計)中fork函式的示例:

1#include

2 #include

3 #include

4 int glob=6;

5 char buf="a write to stdout\n";

6 int main(void)

14    printf("before fork\n");

15    if((pid=fork())<0)else if(pid==0)else

22     sleep(1);

23    printf("pid=%d,glob=%d,var=%d\n",getpid(),glob,var);

24    exit(0);

25 }

執行程式:

uc#./a.out

a write to stdout

before fork

pid=6422,glob=7,var=89

pid=6421,glob=6,var=88

重定向再檢視重定向檔案:

uc#./a.out >q

uc#cat q

a write to stdout

before fork

pid=6424,glob=7,var=89

before fork

pid=6423,glob=6,var=88

前後對比發現,重定向到檔案再輸出時,多了一行通過printf列印的資訊,這是為什麼呢?

原因便在於前面提到的行緩衝與全緩衝,當write到1(標準輸出)時,用的是行緩衝,遇到『\n'便輸出緩衝區內容,而寫檔案時則是全緩衝,要到緩衝區滿或程序結束時才寫入到檔案。

Linux下的fork 函式

fork fork的英文翻譯是 分叉 同樣在linux中我們也可以理解為如果使用了fork 函式,程序也會 分叉 下面進行具體的說明fork 函式。定義 通過系統呼叫建立乙個與原程序幾乎完全相同的程序,其中新產生的程序成為子程序。原型 pid t fork void fid t相當於int型別特殊之...

Linux中fork 函式解析

1.fork 函式 通過系統呼叫建立乙個與原來程序幾乎完全相同的程序,這個新的程序就成為子程序。乙個程序呼叫fork 函式以後,系統先給新的程序分配資源,例如儲存資料可 空間。然後把原來程序的值都複製到新的程序當中,只有少數值與原來不同。呼叫fork 函式之後,fork 之後的 一定是兩個程序同時執...

Linux系統fork函式介紹

fork函式通過拷貝當前程序建立乙個子程序。在fork之前,我們先了解一些別的知識。傳統的fork系統呼叫直接把所有的資源複製給新建立的程序。這種實現過於簡單並且效率低下,因為它拷貝的資料也許並不共享,更糟的情況是,如果新程序打算立即執行乙個新的映像,那麼所有的拷貝都將前功盡棄。linux的fork...