由下面一段cs架構的**說明下,殭屍程序的產生,下面是乙個簡單的回射伺服器,客戶端負責從標準輸入讀入資料,寫到服務端,服務端主程序監聽連線套接字,fork乙個子程序處理連線套接字,讀入資料和回寫給客戶端。大寫的函式只對出錯的情況進行處理。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "socketio.h"
int main()
nread = read(sockfd, recvline, sizeof(recvline));
if(nread < 0)
if (nread == 0)
fputs(recvline, stdout);
memset(sendline, 0, sizeof(sendline));
memset(recvline, 0, sizeof(recvline));
}close(sockfd);
return
0;}
#include
#include
#include
#include
#include
#include
#include "socketio.h"
int main()
if (nread == 0)
printf("nread: %d\n", nread);
fputs(readbuf, stdout);
nwrite = write(connfd, readbuf, strlen(readbuf));
while(nwrite < 0)
}
}else
if (pid < 0)
close(connfd);
}return
0;}
第一次連線通訊時,我們可以看到,並沒有產生殭屍程序。
當客戶端結束通訊,服務端主程序不退出,服務端子程序輸出client close並exit(0)退出時,可以看到殭屍程序產生了。
服務端一直沒有退出,當客戶端發起第二次連線通訊時,我們可以看到,之前產生的程序殭屍程序依然殘留。
客戶端第二次結束通訊,又產生了乙個殭屍程序。
殭屍程序產生的原因是,伺服器子程序終止時,會給父程序傳送乙個sigchld訊號,此時父程序的預設的處理是忽略此訊號,所以產生了殭屍程序,只有等到服務端完全關閉時,才會自動的**殭屍程序,但是服務端通常是長時間的工作,如果每處理乙個連線就會留下乙個殭屍程序的話將會耗費大量資源,所以我們需要捕獲子程序終止時的訊號,讓系統殺死殭屍程序。
此時我們引入乙個waitpid函式
pid_t waitpid(pid_t pid, int* statloc, int options);
成功時返回程序pid(大於零)
此函式用於處理殭屍程序。
還需要乙個捕獲訊號的函式,表明當捕獲到sigchld型別的訊號時呼叫sig_chld函式。
signal(sigchld, sig_chld);
訊號處理函式我們需要在迴圈地呼叫waitpid,原因是防止在進入訊號處理函式的時候收到另外多個sigchld訊號,然而只**獲一次或兩次訊號,從而只能處理1-2次訊號。wnohang引數可以避免有尚未終止子程序執行時阻塞,這也是這裡不用wait的原因。
void sig_chld()
最終服務端的**
#include
#include
#include
#include
#include
#include
#include
#include "socketio.h"
void sig_chld()
int main()
if (nread == 0)
fputs(readbuf, stdout);
nwrite = write(connfd, readbuf, strlen(readbuf));
while(nwrite < 0)
}
}else
if (pid < 0)
close(connfd);}}
最終結果,客戶端結束通訊,服務端子程序結束,主程序仍然在執行時,不產生殭屍程序。
mysql殭屍程序 殭屍程序產生原因和解決方法
在linux系統中,當用ps命令觀察程序的執行狀態時,經常看到某些程序的狀態列為defunct,這就是所謂的 殭屍 程序。殭屍 程序是乙個早已死亡的程序,但在程序表 processs table 中仍佔了乙個位置 slot 由於程序表的容量是有限的,所以,defunct程序不僅占用系統的記憶體資源,...
Linux下如何避免殭屍程序的產生
比如程序採用exit 退出的時候,作業系統會進行一些列的處理工作,包括關閉開啟的檔案描述符 占用的記憶體等等,但是,作業系統也會為該程序保留少量的資訊,比如程序id號等資訊,因而占用了系統的資源。在一種極端的情況下,檔殭屍程序過多的時候,占用了大量的程序id,系統將無法產生新的程序,相當於系統的資源...
殭屍程序產生原因和解決方法
在linux系統中,當用ps命令觀察程序的執行狀態時,經常看到某些程序的狀態列為defunct,這就是所謂的 殭屍 程序。殭屍 程序是乙個早已死亡的程序,但在程序表 processs table 中仍佔了乙個位置 slot 由於程序表的容量是有限的,所以,defunct程序不僅占用系統的記憶體資源,...