fork函式小結

2021-08-05 22:05:19 字數 1417 閱讀 1215

在unix系統中,只有乙個系統呼叫可以用來建立新程序:fork。

由fork建立的新程序被稱為子程序。fork函式被呼叫一次,但返回2次。2次返回的區別是子程序的返回值是0,而父程序的返回值是新建立的額子程序的程序id。

子程序和父程序繼續執行fork呼叫之後的指令。子程序是父程序的副本。例如,子程序獲得父程序資料空間、堆和棧的副本。注意,這是子程序所擁有的副本。父程序和子程序並不共享這些儲存空間。

例如

#include

#include

#include

#include

#include

int main()

else

if(pid>0) //父程序

else

//子程序

printf("pid = %ld, n = %d\n",(long)getpid(),n);

exit(0);

}

執行的結果為

可以看到,子程序的變數值改變了,父程序的變數值沒有改變

fork的乙個特性是父程序的所有開啟檔案描述符都被複製到子程序中。我們說「複製」是因為對每個檔案描述符來說,就好像執行了dup函式。父程序和子程序每個相同的開啟描述符共享同乙個檔案表項。

重要的一點是, 父程序和子程序共享同乙個檔案偏移量。考慮下述情況: 乙個程序fork了乙個子程序, 然後等待子程序終止. 假定,作為普通處理的一部分, 父程序和子程序都向標準輸出進行寫操作。如果父程序的標準輸出己重定向(很可能是由shell實現的), 那麼子程序寫到該標準輸出時, 它將更新與父程序共亭的該檔案的偏移量. 在這個例子中, 當父程序等待子程序時, 子程序寫到標準輸出:而在子程序終止後, 父程序也寫到標準輸出上, 並且知道其輸出會追加到子程序所寫資料之後。如果父程序和子程序不共享同一檔案偏移量,要實現這種形式的互動就要困難得多。

#include

#include

#include

#include

#include

#include

#include

#define maxlen 1024

int main()

else

if(pid>0)

else

exit(0);

}

執行結果

可以看到,父程序的寫入的資料在子程序寫入的資料之後。

fork函式的一些小結

今天遇到乙個這樣的問題,假設父程序有乙個變數s,fork後,子程序中的變數s位址是否和父程序中的變數s 是相同的?再學作業系統的時候,知道fork是採用的寫時複製,所以如果子程序或者父程序不對變數s做修改的話,它們應該 是指向同一塊物理記憶體,如果有修改,那麼它們會指向不同的物理記憶體,但虛擬記憶體...

fork 函式 fork 函式的使用

fork的意思是個叉子,在unix及其衍生版linux中,用於建立子程序,現在看一下fork函式的基本用法。include includeint main printf c b fflush stdout fork printf c c fflush stdout 上圖的輸出是什麼呢?答案是 bab...

c 中的fork函式 FORK()函式

乙個程序,包括 資料和分配給程序的資源。fork 函式通過系統呼叫建立乙個與原來程序幾乎完全相同的程序,也就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事。乙個程序呼叫fork 函式後,系統先給新的程序分配資源,例如儲存資料和 的空間。然後把原來的程序的所有...