在之前我們為了避免出現殭屍程序我們採用了兩種方式
1、呼叫wait()函式使父程序去等待子程序。wait()是一種阻塞等待
2、呼叫waitpid()函式這也是父程序去等待子程序而waitpid()分為阻塞式等待和非阻塞式等待,輪詢的方式就是建立在非阻塞等待的基礎之上的
而sigchld訊號也可以避免出現殭屍程序
建立殭屍程序
#include
#include
int main()
else
return
0;}
使用wait來解決殭屍程序
方式一:
採用wait()函式去等待
#include
#include
#include
#include
int main()
else
return
0;}
傳送乙個sigchld訊號
#include
#include
#include
#include
#include
void myhandler(int sig)
int main()
else
system("ps -o pid,ppid,state,tty,command");
return
0;}
但是這樣只處理了乙個殭屍程序
假如有多個殭屍程序呢,因為收到多個訊號,但是只記錄一次因此需要迴圈**.
因為如果是9個子程序都退出了,還有乙個沒有退出,但必須也要在最後乙個退出的時候給父程序傳送乙個sigchld訊號,因此要是非阻塞的
#include
#include
#include
#include
#include
void myhandler(int sig)
int main()
else
system("ps -o pid,ppid,state,tty,command");
return
0;}
Linux 竟態條件和SIGCHLD
乙個函式被多個執行流呼叫,有可能在第一次呼叫還沒返回時就再次進入函式,稱為重入。例如上面的insert函式,在執行第一步時收到訊號產生硬體中斷,轉去訊號處理函式,而訊號處理函恰好呼叫了insert函式,由於兩個函式操縱了同乙個鍊錶而產生意外的結果,所以這個函式是不可重入函式。如果這個函式只是操縱自己...
Linux下微信安裝教程
wget 3,把解壓的資料夾放在 opt下。sudo mv electronic wechat linux x64 opt electronic wechat linux x64sudo ln s opt electronic wechat linux x64 electronic wechat u...
linux下trap命令和SIGHUP訊號量詳解
trap命令用於指定在接收到訊號後將要採取的動作。常見的用途是在指令碼程式被中斷時完成清理工作。我在寫自動公升級指令碼的時候,為防止指令碼執行期間是不能允許其使用ctrl c等中斷退出的,故使用了trap命令。一 關於訊號 歷史上,shell總是用數字來代表訊號,而新de指令碼程式應該使用訊號de名...