fork 子程序不繼承父程序開啟的檔案描述符

2021-07-11 01:31:38 字數 801 閱讀 3470

昨天面試被問到了這個問題,沒有回答上來,網上找了一下答案。

解決方法是使用clone系統呼叫使用引數在複製時將父程序資源有選擇地複製給子程序。

下面介紹forkvforkclone三者的區別

vfork系統呼叫不同於fork,用vfork建立的子程序與父程序共享位址空間,也就是說子程序完全執行在父程序的位址空間上,如果這時子程序修改了某個變數,這將影響到父程序。

因此,上面的例子如果改用vfork()的話,那麼兩次列印a,b的值是相同的,所在位址也是相同的。

但此處有一點要注意的是用vfork()建立的子程序必須顯示呼叫exit()來結束,否則子程序將不能結束,而fork()則不存在這個情況。

vfork也是在父程序中返回子程序的程序號,在子程序中返回0。

用 vfork建立子程序後,父程序會被阻塞直到子程序呼叫exec(exec,將乙個新的可執行檔案載入到位址空間並執行之。)或exit。vfork的好處是在子程序被建立後往往僅僅是為了呼叫exec執行另乙個程式,因為它就不會對父程序的位址空間有任何引用,所以對位址空間的複製是多餘的 ,因此通過vfork共享記憶體可以減少不必要的開銷。

系統呼叫fork()和vfork()是無引數的,而clone()則帶有引數。fork()是全部複製,vfork()是共享記憶體,而clone()是則可以將父程序資源有選擇地複製給子程序,而沒有複製的資料結構則通過指標的複製讓子程序共享,具體要複製哪些資源給子程序,由引數列表中的clone_flags來決定。另外,clone()返回的是子程序的pid。

參考:

子程序繼承父程序中互斥鎖的討論

1.引言 首先明確乙個問題 如果乙個多執行緒程式的某個執行緒呼叫了fork函式,那麼新建立的子程序裡是不會自動建立和父程序相同數量的執行緒的,它只是呼叫fork的那個執行緒的完整複製。並且,子程序會自動繼承父程序中 包括父程序在呼叫fork之前建立的執行緒 互斥鎖的狀態。也就是說,父程序中已經被加鎖...

gdb 子程序 多程序 fork 除錯

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

python程序之fork建立子程序

程式執 到os.fork 時,作業系統會建立 個新的程序 程序 然後複製 程序的所有資訊到 程序中 然後 程序和 程序都會從fork 函式中得到 個返回值,在 程序中這 個值 定是0,程序中是 程序的 id號 在unix linux作業系統中,提供了 個fork 系統函式,它 常特殊。普通的函式調 ...