Linux下殭屍程序的產生和解決方法

2021-08-17 02:18:23 字數 2710 閱讀 6965

由下面一段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程序不僅占用系統的記憶體資源,...