Unix建立子程序

2022-08-30 05:03:12 字數 1452 閱讀 1121

fork函式用於在已存在程序中新建程序。fork函式呼叫一次,返回兩次。當fork返回值為0時,當前程序為fork函式建立的子程序;當fork函式返回值大於0時,當前程序與fork函式呼叫前的程序一致,我們稱之為父程序;當fork函式返回值為-1時,fork函式建立子程序失敗。系統無法保證父程序與子程序的呼叫順序,此處,對父程序與子程序的呼叫順序做出任何假設都是錯的。當需要保證父程序與子程序執行順序時,需要使用程序間通訊(interprocess communication , ipc)方法來調整程序執行流程。fork函式呼叫失敗可能原因如下:

系統中程序總數過多

該使用者所建立的程序總數過多

子程序是父程序的複製品,子程序中的堆(heap)、棧(stack)、資料片段( data space)與父程序完全一致。父程序與子程序僅保持**片段(text segment)的共享。由於fork函式常用與新建子程序並執行指定程式,這時不需要對父程序進行大量複製操作。unix作業系統使用了寫入時複製(copy-on-write,cow)技巧,當子程序中資料第一次被修改時,核心首先對需要複製的部分內容複製到子程序中,然後再執行相應操作。部分作業系統提供spawn函式作為fork函式後跟exec函式的代替品。在posix標準中,子程序僅複製父程序的呼叫執行緒(即,由哪乙個執行緒呼叫了fork函式,則子程序複製該執行緒),而在solaris系統中,子程序複製父程序的所有執行緒。

當子程序先於父程序終止時,父程序需要通過wait或waitpid函式獲取子程序的終止狀態(termination status),並釋放子程序所占用的系統資源。若子程序結束後,父程序尚未釋放子程序所占用的資源,則子程序進入僵死(zombie)狀態。當父程序先於子程序終止時,初始化程序(init process)將成為子程序的父程序(初始化程序是一切父程序已終止的程序的父程序)。初始化程序會自動釋放已僵死程序所占用的系統資源。

當父程序開啟了多個檔案時,子程序僅複製父程序的檔案描述符,其形式類似與dup函式被呼叫的過程。fork函式執行後父程序與子程序的檔案關係如圖1所示

圖1. 子程序與父程序的檔案關係

由於子程序與父程序共享同乙個檔案列表,當同時在父程序與子程序中操作同乙個檔案時,需要注意檔案內容的同步。

子程序從父程序繼承的屬性如下:

父程序與子程序之間的區別在於:

vfork函式與fork函式類似。vfork函式與fork函式的區別在於,vfork函式子程序不複製父程序的位址空間(address space),對子程序中資料的操作與對父程序資料操作具有同等效果。子程序僅能簡單的執行exec函式或exit函式。vfork函式保證子程序呼叫提前于父程序呼叫,當子程序以呼叫exec或exit函式後,父程序才恢復執行。

如果在vfork函式建立的子程序中呼叫exit函式,由於子程序與父程序使用共同的位址空間,exit函式將關閉所有開啟的檔案,並清空快取,子程序結束後父程序中檔案操作的行為是不確定的。

Unix 父子程序以及建立子程序

unix系統中程序存在父子關係,父程序擁有多個子程序,子程序只能有乙個父程序。pid為0的程序為排程程序,也是根程序。系統中所有的程序構成了乙個以排程程序為根的程序樹。pid為1的程序是init,init程序負責系統的初始化,同時也負責 孤兒程序,稱為孤兒院程序。當父程序通過fork建立子程序,會複...

linux c建立子程序

前言 了解fork 函式 乙個程序呼叫fork 函式建立該程序子程序,系統會為該子程序分配資源儲存資料和 的空間,父程序將資料和 複製給子程序,子程序按父程序 重新執行,即轉殖了父程序並重新執行。fork 函式的返回值,1即fork失敗,值為0時即子程序,返回值大於0即子程序id c 樣例 incl...

linux建立子程序

include include include intmain int argc,char ar else if pid 0 else if pid 0 return0 include include include intmain int argc,char ar else if pid 0 el...