子程序和父程序的開始與結束
子程序結束的時候會向父程序傳送訊號,讓父程序幫助**程序
父程序先結束的時候,子程序會過繼到init程序下(即指定init程序為新的父程序)
如果父程序因為各種原因沒有收到子程序傳送的訊號,則無法**子程序的資源,子程序會成為殭屍程序
子程序與父程序的資源
程序的記憶體區劃分:**區、全域性區,堆區,**區
子程序中的資源得到的是父程序的乙份拷貝,(包括全域性區,棧區,堆區) ,**區與父程序共享
子程序資源的**
pid_t wait(int * status);
相當於waitpid(-1,&status,0);
pid_t waitpid(pid_t pid,int * status, int options);
關於pid的引數
< -1 等待所有組id等於pid的絕對值的子程序
= -1 等待所有子程序
= 0 等待所有組id等於父程序組id的子程序
> 0 等待pid為pid的子程序
關於options的引數
whong :如果沒有子程序結束的話立刻返回
wuntraced :
wcontinued
返回值:
正常返回pid
錯誤返回-1 如果所有子程序都已經**完畢 errno會被設定為 echild
程序的建立
1. fork ():子程序拷貝父程序的資料段,**段
vfork ( ):子程序與父程序共享資料段
2. fork ()父子程序的執行次序不確定
vfork 保證子程序先執行,在呼叫exec 或exit 之前與父程序資料是共享的,在它呼叫exec
或exit 之後父程序才可能被排程執行。
3. vfork ()保證子程序先執行,在她呼叫exec 或exit 之後父程序才可能被排程執行。如果在
呼叫這兩個函式之前子程序依賴於父程序的進一步動作,則會導致死鎖。
程序的終止
正常的終止方式
a.在main函式中執行了return 0;
b.呼叫exit()函式終止程序
c.呼叫_exit()/_exit()函式終止程序
d.最後乙個執行緒返回
e.最後乙個執行緒呼叫了pthread_exit()函式
非正常的終止方式
a.採用訊號終止程序,ctrl+c
b.最後乙個執行緒被其他執行緒呼叫了pthread_cancel()取消
atexit(void (* func)(void));註冊乙個在退出的時候執行的函式
註冊的函式將在exit或者return時呼叫
如果使用_exit()/_exit()時將不會呼叫註冊的函式
程序管理
wait 函式用於掛起當前正在執行的程序,進入阻塞狀態,等待子程序的狀態改變(終止)
pid_t wait(int * status)引數用於獲取子程序改變的狀態
成功返回所等到的子程序的狀態,失敗返回-1 擴充套件
呼叫fork的次數和生成的子程序數量為 2的n次方
建立三個程序
fork();
if(0!=pid)
waitpid**子程序,不包括子程序的子程序
我們建立如下子程序
pid_t p1,p2;
p1 = fork();
if(0 == p1)
if(0 == p2)
while(1)
printf("all child was died\n");
}else if(pres)
else}
output:
輸出結果可以得出只**了有主程序建立的兩個子程序,而由子程序建立的子程序並沒有被**
linux c語言程式設計中《程序的管理wait函式》
linux wait函式解析 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序,wait 就會收集這個子程序的資訊,並把它徹底銷毀後返回 如果沒有找到這樣乙個子程序,wait就會一直阻塞在這裡,直到有乙個出現為止。...
Linux C程序管理之訊號 共享記憶體
訊號的本質 訊號是在軟體層上對中斷機制的一種模擬。kill alarm 等函式 訊號種類 訊號分為可靠訊號和不可靠訊號 unix系統只定義了 32種訊號,red hat 支援64 種訊號,訊號大於 32 64 的為可靠訊號,其餘為不可考訊號 我主要想給大家介紹的是下面的關於訊號的幾個函式 1.kil...
Linux C程序 執行緒
1 程序間通訊 庫 在使用者空間是不可能實現程序通訊,可通過linux核心建立物件來通訊 pid t pid 程序號的型別定義 pid fork 建立程序 if pid 0 子程序 if pid 1 父程序 2 執行緒間通訊 庫 在使用者空間可以實現執行緒間通訊,通過全域性變數通訊 pthread ...