linux下避免殭屍程序的幾種方法

2022-09-12 02:54:14 字數 2043 閱讀 2996

linux下我們可以呼叫fork函式建立子程序,建立的子程序將會得到父程序的資料空間、堆、棧......副本(採用寫時複製機制),子程序將會繼承父程序的訊號掩碼、訊號處理方式、當前工作目錄、會話id、組id......。當子程序退出時父程序應當及時獲取子程序退出狀態,否則,如果父程序是一直在執行,那麼子程序的退出狀態將一直儲存在記憶體中,直到父程序退出才釋放。

我們可以使用如下幾種方法避免殭屍程序的產生:

1.在fork後呼叫wait/waitpid函式取得子程序退出狀態。

2.呼叫fork兩次(第一次呼叫產生乙個子程序,第二次呼叫fork是在第乙個子進

程中呼叫,同時將父程序退出(第乙個子程序退出),此時的第二個子程序的父

程序id為init程序id(注意:新版本ubuntu並不是init的程序id))。

3.在程式中顯示忽略sigchld訊號(子程序退出時會產生乙個sigchld訊號,我

們顯示忽略此訊號即可)。

4.捕獲sigchld訊號並在捕獲程式中呼叫wait/waitpid函式。

方法一:

#include "../common/common.h"

int main(void)

else

if (0 == pid)

//sleep(15);

if (waitpid(pid, null, 0) < 0)

for (; ;)

return exit_success;

}

方法二:

#include #include "../common/common.h"

int main(void)

else

if (0 == pid) else

if (pid > 0)

sleep(2);/**確保父程序先執行**/

printf("second process pid: %ld, second process's parent pid: %ld\n", (long)getpid(), (long)getppid());

//sleep(15);

printf("[%ld] is exit..\n", (long)getpid());

_exit(0);

}/***獲得第乙個子程序的退出狀態***/

if (waitpid(pid, null, 0) < 0)

for(;;)

pause();

return exit_success;

}

方法三:

#include #include "../common/common.h"

int main(void)

pid_t pid;

int i;

/**產生10個子程序***/

for (i=0; i<10; ++i) else

if (0 == pid)

sleep(2);

continue;

}for (; ;)

pause();

return exit_success;

}

方法四:

#include #include #include "../common/common.h"

void sig_chld(int signo);

int main(void)

pid_t pid;

int i;

for (i=0; i<10; i++) else

if (0 == pid)

sleep(1);

continue;

}for (; ;)

return exit_success;

}/**捕獲到訊號後會立刻執行此段*****/

void sig_chld(int signo)

if (signal(sigchld, sig_chld) == sig_err)

}

Linux下多程序避免殭屍程序的方法

include include include include include include include include include include include wait null 只要有乙個子程序退出,那麼wait就會返回 若多個子程序,只能等待乙個。while waitpid 1,...

Linux下如何避免殭屍程序的產生

比如程序採用exit 退出的時候,作業系統會進行一些列的處理工作,包括關閉開啟的檔案描述符 占用的記憶體等等,但是,作業系統也會為該程序保留少量的資訊,比如程序id號等資訊,因而占用了系統的資源。在一種極端的情況下,檔殭屍程序過多的時候,占用了大量的程序id,系統將無法產生新的程序,相當於系統的資源...

避免殭屍程序

下面通過 為了觀察,完成同樣的功能,體會三種程序等待方式的區別。三種等待方式 1.wait waitpid 忽略sigchild訊號 忽略sigchild訊號只在linux下有效 2.wait只能進行阻塞等待,waitpid既可以用於阻塞等待,也可以用於非阻塞等待 waitpid 當waitpid的...