程序的建立 fork與vfork

2021-08-21 23:57:05 字數 1516 閱讀 8618

目錄

fork函式

fork的使用

vfork函式

fork() 與 vfock() 都是建立乙個程序,那它們有什麼區別呢?

程序的正常終止方法?

程序的異常終止

為什麼vfork()子程序中可以呼叫_exit(),卻不可以呼叫exit(),也不可以直接return呢?

標頭檔案  #include

函式原型  pid_t fork(void)

fork功能  建立子程序 父子程序**共享,資料個自開闢空間,私有乙份(採用寫時拷貝)

結果  一次呼叫 有兩個返回值,它可能有三種不同的情況

1.    在父程序中,fork返回新建立的子程序的pid。父程序可以建立多個子程序.根據子程序的pid來區分子程序

2.    在子程序中,fork返回0;

3.    如果出現錯誤,fork返回乙個負值。

一般來說,fork之後父、子程序執行順序是不確定的,這取決於核心排程演算法。程序之間實現同步需要進行程序通訊。

乙個父程序希望子程序同時執行不同的**段,這在網路伺服器中常見——父程序等待客戶端的服務請求,當請求到達時,父程序呼叫fork,使子程序處理此請求。

乙個程序要執行乙個不同的程式,一般fork之後立即呼叫exec

程序呼叫fork,在核心中,進行以下操作:

fork出錯可能有兩種原因:

1)當前的程序數已經達到了系統規定的上限,這時errno的值被設定為eagain。

2)系統記憶體不足,這時errno的值被設定為enomem。

#include

#include

pid_t vfork(void)

功能:建立子程序

成功:子程序中返回 0,父程序中返回子程序 id。pid_t,為無符號整型。失敗:返回 -1。

1)fork(): 父子程序的執行次序不確定。

vfork():保證子程序先執行,在它呼叫 exec(程序替換) 或 exit(退出程序)之後父程序才可能被排程執行。

vfork():子程序共享父程序的位址空間(準確來說,在呼叫 exec(程序替換) 或 exit(退出程序) 之前與父程序資料是共享的)子程序不會完全複製父程序的位址空間,它會在父程序的位址空間中執行。vfork建立的子程序,共享的是父程序當前棧幀的位址空間。

_exit()呼叫之後會立即進入核心

清理i/o緩衝區,關閉檔案描述符後再退出程序 

語言級別的,它表示了呼叫堆疊的返回,

如果是在主函式main, 自然也就結束當前程序

exit()是對_exit()的封裝,它自己在呼叫_exit()前會做很多清理工作,其中包括重新整理並關閉當前程序使用的流緩衝(比如stdio.h裡面的printf等),由於vfork()的子程序完全共享了父程序位址空間,子程序裡面的流也是共享的父程序的流,所以子程序裡面是不能做這些事的。

直接return就更不行,子程序return以後,會從當前函式的外部呼叫點後面繼續執行,這後面子程序可能將會執行很多語句,結果就沒法預料了。

程序建立函式fork與vfork

1.fork 1 函式的功能 建立乙個程序 2 函式的原型 pid t fork void 3 函式的返回值 0 出錯 0 子程序 0 父程序 其值為子程序的識別號 4 標頭檔案 include fork的奇妙之處在於它被呼叫一次,卻返回兩次,它可能有三種不同的返回值。include include...

程序建立之fork與vfork

由圖中的對映關係我們可以發現,虛擬位址與實體地址並不是一一對應的,這樣也就會出現一種問題,乙個變數位址相同內容不同,其實是虛擬位址相同,所對應的實體地址不同的原因 那麼是誰管理著虛擬位址空間呢?pcb中有mm strct管理虛擬位址空間 linux中絕大多數函式出錯返回值都是 1,函式出錯後將錯誤編...

程序建立fork 和vfork

乙個現有的程序可以通過兩種方式建立乙個新的程序,下面詳細介紹兩種fork vfork 函式原型 man 手冊 include pid t fork void 描述 fork 以當前的程序為副本建立乙個新的程序,新建立的程序被稱為子程序,當前的程序被稱為父程序,父程序和子程序執行在各自的位址空間。返回...