1. 程式人生 > >fork()函式

fork()函式

一.fork創建出的父子程序
1.有fork創建出來的新程序被稱為子程序,該函式呼叫一次,但返回兩次,其中父程序返回的是子程序的pid,子程序返回的是0。子程序可以通過呼叫getpid()來獲取自己的pid,也可以呼叫getppid()來獲取父程序的pid。
2.fork之後,作業系統會複製一個與父程序完全相同的子程序,雖然是父子關係,但這兩個程序共享程式碼空間,但是資料空間是獨立的,子程序資料空間中的內容是父程序的完整拷貝,指令指標也完全相同,子程序擁有父程序當前執行到的位置(兩個程序的程式計數器pc值相同,也就是說,子程序是從父程序返回出開始執行的),如果fork失敗,父程序返回錯誤。
3.fork後兩個程序執行的順序由作業系統決定。

二、fork出的子程序和父程序的繼承關係
fork出來的子程序,基本上除了程序號之外父程序的所有東西都有一份拷貝,子程序得到的只是父程序的拷貝,而不是父程序資源的本身。

由子程序自父程序繼承到:
1.程序的資格(真實(real)/有效(effective)/已儲存(saved)使用者號(UIDs)和組號(GIDs))
2.環境(environment)
3.堆疊
4.記憶體
5.開啟檔案的描述符(注意對應的檔案的位置由父子程序共享,這會引起含糊情況)
6.執行時關閉(close-on-exec) 標誌 7.訊號(signal)控制設定
7.nice值 (nice值由nice函式設定,該值表示程序的優先順序,數值越小,優先順序越高)
程序排程類別(scheduler class)(程序排程類別指程序在系統中被排程時所屬的類別,不同類別有不同優先順序,根據程序排程類別和nice值,程序排程程式可計算出每個程序的全域性優先順序(Global process prority),優先順序高的程序優先執行)
8.程序組號
9.對話期ID(Session ID) (指:程序所屬的對話期(session)ID, 一個對話期包括一個或多個程序組)
10.當前工作目錄
11.根目錄 (根目錄不一定是“/”,它可由chroot函式改變)
12.檔案方式建立遮蔽字(file mode creation mask (umask))(建立新檔案的預設遮蔽字)
13.資源限制
14.控制終端

子程序所獨有:

程序號
1.不同的父程序號(即子程序的父程序號與父程序的父程序號不同, 父程序號可由getppid函式得到)
2.自己的檔案描述符和目錄流的拷貝(目錄流由opendir函式建立,因其為順序讀取,顧稱“目錄流”)
3.子程序不繼承父程序的程序,正文(text), 資料和其它鎖定記憶體(memory locks)(鎖定記憶體指被鎖定的虛擬記憶體頁,鎖定後,4.不允許核心將其在必要時換出(page out))
5.在tms結構中的系統時間(譯者注:tms結構可由times函式獲得,它儲存四個資料用於記錄程序使用中央處理器 (CPU:Central Processing Unit)的時間,包括:使用者時間,系統時間, 使用者各子程序合計時間,系統各子程序合計時間)
6.資源使用(resource utilizations)設定為0
8.阻塞訊號集初始化為空集
9.不繼承由timer_create函式建立的計時器
10.不繼承非同步輸入和輸出