pid_t fork(void)
#include
fork()會產生乙個新的子程序。其子程序會複製父程序的資料與堆疊空間,並繼承父程序的使用者**、組**、環境變數、已開啟的檔案**、工作目錄和資源限制等。由於這些繼承的資訊是複製而
來,並非指相同的記憶體空間,因此子程序對這些變數的修改和父程序並不會同步。此 外,子程序不會繼承父程序的檔案鎖定和未處理的訊號。
注意,linux 不保證子程序會比父程序先執行或晚執行,因此編寫程式時要留意死鎖或競爭條件的發生。
返回值,如果 fork()呼叫成功則在父程序會返回新建立的子程序**(pid),而在新建立的子程序中則返回 0。如果 fork() 失敗則直接返回-1,失敗原因存於 errno 中。
fork函式詳解
有以下**
#include
#include
intmain()
else
return0;
}
gcc -s test.c
得到彙編**
可以看到fork 的call指令後面有乙個mov指令
要知道賦值操作是從右向左,也就是對於p=fork(),先呼叫fork後再把返回值給p
所以子程序和父程序都會有p的賦值操作。但是兩個程序中p的值是不一樣的,這就有了fork函式的雙返回值的效果
fork函式雙返回值詳解
fork()是父程序委託作業系統建立子程序。
在單cpu、單核、單指令流水(某一時刻只能有乙個程序在執行)的情況下,
父程序呼叫fork時要把自己變為阻塞態,在這之前先儲存現場。
進而讓os建立子程序,這時要對子程序初始化執行現場。
把子程序的ax初始化為0,同時會把父程序的ax修改為子程序的pid。
所以在子程序和父程序的mov [ebp-12], ax的時候分別把0和子程序pid送給相應位置。
pid_t getpid(void)
#include
getpid()用來取得目前程序的程序識別碼。
返回值:目前程序的程序識別碼。
pid_t getppid(void)
#include
getppid()用來取得目前程序的父程序識別碼。
返回值:目前程序的父程序識別碼。
對於以上程式,有以下執行結果
當把sleep的注釋去掉後,執行結果就會變成這樣
原因是當父程序執行完畢後就會被os**,這時它的子程序還沒有執行完。對於這個子程序來說,它的父親沒有了,所以他就變成了孤兒程序,這時就會被系統的孤兒院程序收養,這裡收養他的孤兒院程序就是1242.
如果父程序等待到子程序結束之後在被**,那麼在子程序中找它父程序的pid就是當前父程序的pid。
pid_t wait(int *status)
#include
#include
wait() 會暫停目前程序的執行,直到有訊號來到或子程序結束。如果在呼叫
wait()時子程序已經結束,則 wait()會立即返回子程序的結束狀態值。子程序的結束狀 態值會由引數 status 返回,而子程序的程序識別碼也會一塊返回。如果不在意結束狀態 值,則引數 status 也可以設定成 null。該函式若執行成功,則返回子程序識別碼
(pid),否則返回-1,失敗原因存於 errno 中。
當乙個程序結束時,會產生乙個終止狀態字,然後核心發出乙個sigchld訊號通知父程序。
wait最常用的作用是讓乙個程序等待另乙個程序,最常見的是父程序等待自己的子程序
pid_t waitpid(pid_t pid, int *status, int options);
#include
#include
pid>0
只等待程序id等於pid的子程序,不管其它已經有多少子程序執行結束退出了,只要指定的子程序還沒有結束,waitpid就會一直等下去。
pid=-1
等待任何乙個子程序退出,沒有任何限制,此時waitpid和wait的作用一模一樣。
pid=0時
等待同乙個程序組中的任何子程序,如果子程序已經加入了別的程序組,waitpid不會對它做任何理睬。
pid等待乙個指定程序組中的任何子程序,這個程序組的id等於pid的絕對值。
引數status如果不是乙個空指標,則終止程序的終止狀態就存放在status所指向的單元。
引數status如果是乙個空指標,則表示父程序不關心子程序的終止狀態
option
wnohang 若由pid指定的子程序未發生狀態改變(沒有結束),則waitpid()不阻塞,立即返回0
wuntraced 返回終止子程序資訊和因訊號停止的子程序資訊
wcontinued 返**到sigcont訊號而恢復執行的已停止子程序狀態資訊
返回值:
成功 成功結束執行的子程序的程序號
失敗 返回-1
wnohang 沒有子程序退出返回0
編寫程式
利用 fork()產生兩個子程序,首先顯示一下兩個子程序及父程序的程序識別符號;然後讓父程序顯示 1-26 個數字,子程序 1 顯示 26 個大寫字母,子程序 2 顯示 26 個小寫字母。讓大小寫字母及數字是夾雜交錯輸出的。
#include
#include
#include
intmain()
else
if(pid==0)
}else
else
if(pid1==0)
}else}}
return0;
}
Linux中殭屍程序和孤兒程序詳解
1 殭屍程序 乙個子程序在其父程序沒有呼叫wait 或waitp程式設計客棧id 的情況下退出,這個子程序就是殭屍程序。如果其父程序還存在而一直不呼叫wait,則該殭屍程序將無法 等到其父程序退出後該程序將被init 執行結果 2 孤兒程序 乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子...
fork函式的詳解
1.呼叫一次,返回兩次。2.子程序中 fork返回0 父程序中 fork 返回子程序的 pid。原因是 在子程序中通過呼叫 getppid 可以方便的指導父程序的 pid 沒有乙個函式可以使父程序獲得其所有子程序的 pid。所以在 fork 返回時,將子程序的 pid直接返回給父程序 注 子程序的 ...
關於linux下fork 的底層實現 詳解
fork 系統呼叫通過複製乙個現有程序來建立乙個全新的程序 程序的另外乙個名字叫做任務 程序被存放在乙個叫做任務佇列的雙向迴圈鍊錶中。鍊錶中的每一項都是型別為task struct稱為程序描述符的結構。它包含乙個具體程序的所有資訊 程序描述符的存放 核心通過乙個唯一的程序標識值或pid來標識每個程序...