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的...