前言但是,一味的建立程序,而不對程序進行合理的管理,必然會造成作業系統的冗餘,長時間下來,因為無用程序過多,系統將會崩潰。因為每個程序需要對自己維護乙個pcb的結構體,來描述乙個程序所有可能用到的資源、標誌…所以,這個結構體並不小,且每個程序都自己私有乙個,所以對無用程序的pcb管理是很有必要的。
作業系統把無用或退出程序的pcb管理交給了他的父程序,每個擁有子程序的父程序函式體中都有乙個等待操作,需要對他建立的子程序進行管理,畢竟,父親管兒子天經地義嘛!所以,父程序在執行完自己的所有操作後,會以阻塞或者輪詢的方式等待子程序的退出,收到子程序的退出資料之後,通過一定的手段,對子程序的pcb進行資源的釋放。
驗證子程序退出時給父程序傳送訊號
#include
#include
#include
void handler(int sig)
int main()
printf("\n");
pid_t id=fork();
if(id<0)else
if(id==0)
printf("i am father:%d\n",getpid());
sleep(1);
return
0;}
使用signal函式實現對訊號的捕捉,捕捉到17號訊號,即sigchld訊號。
程式執行結果:
父程序先退出,子程序退出之後給父程序傳送乙個訊號。
現在已經驗證子程序退出時會對父程序發出乙個sigchld的訊號,所以我們可以對這個訊號進行捕捉,自定義的訊號處理方式表位等待乙個子程序,所以這就省去了對於乙個子程序的阻塞等待或者輪詢等待時資源的耗費。
**
#include
#include
#include
#include
#include
#include
void catchsig(int sig)
else
}while(1);
}int main()
else
}return
0;}
輸出結果:
SIGCHLD訊號與父程序非同步等待子程序
阻塞式等待 函式,當然waitpid函式當其第三個引數不為 時也是阻塞式等待。非阻塞式等待 輪詢的方式 當waitpid函式當其第三個引數為 是非阻塞式等待。父程序可以阻塞等待子程序結束,也可以非阻塞地查詢是否有子程序結束等待清理 也就是輪詢的方式 若採用阻塞等待方式,父程序就不能處理自己的工作了 ...
子程序的非同步等待方式
一 子程序退出時會給父程序傳送訊號 預設的父程序對子程序的操作是忽略,而子程序退出時會向父程序傳送乙個訊號,我們現在要做的就是捕捉子程序退出時向父程序傳送的訊號。如下 1 include 2 include 3 include 4 include 5 include 6 include 7 8 vo...
子程序的非同步等待方式
通過之前所學的知識,我們可以了解到,通過wait函式或者waitpid函式可以清理殭屍程序,父程序可以通過兩種方式等待子程序,一種是阻塞方式,另一種是非阻塞方式,而不管是那種方式,父程序都做不到完全不理會子程序而去完成自己的動作,即子程序不能達到非同步等待的目的。一 sigchld訊號 1 關於si...