如何避免出現殭屍進程
所謂殭屍進程,就是指子進程結束後,其實並沒有真正被銷燬,而是留下一個稱為殭屍進程(Zombie)的'數據結構,它幾乎放棄了所有內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載進程的退出狀態等供其他進程蒐集,此時即使用root身份kill -9也不能將其殺死,此時唯一的補救辦法就是找到它的父進程,並將其殺死,此時殭屍進程過繼給init,由init負責回收。那麼怎樣用兩次fork來避免殭屍進程呢
#include
#include
#include
#include
#include
int main()
{
pid_t pid;
pid=fork();
if(pid<0)
{
perror("child1 create failedn");
exit(-1);
}
else if(pid==0)
{
/*child1*/
pid=fork();
if(pid<0)
{
perror("child2 create failedn");
exit(-1);
}
else if(pid>0)
{
/*child1結束*/
exit(0);
}
/*child2*/
sleep(2);//因為不知道child1和child2哪個先執行,所以讓child2先睡兩秒
/*TODO child2*/
exit(0);
}
/*parent*/
if(waitpid(pid,NULL,0)!=pid) //wait for child1
{
perror("waitpid errorn");
exit(-1);
}
/*TODO parent*/
exit(0);
}
總的説來,其實就是父進程parent創建一個子進程child1,child1再創建它的子進程child2,此時結束child1,child2就自然過繼給init啦,這樣以後無論怎樣,當child2結束時直接就由init釋放,再也影響不到parent進程了,也不可能會出現殭屍進程啦
-
關於Linux C程序存儲空間的邏輯佈局
LinuxC程序存儲空間的邏輯佈局是怎麼樣的?為了方便大家,下面YJBYS小編為大家整理了關於LinuxC程序存儲空間的邏輯佈局的文章,希望對你有所幫助。一、APUE上指出了LinuxC程序存儲空間的邏輯佈局,對於X86上的`Linux正文段從0x08048000單元開始棧底則在0xC0000000之...
-
Linux運維工程師面試題庫
LPI和Sair認證計劃的考試對象是具有相當經驗的Linux網絡和系統管理員,而Linux+認證則主要面向只有半年左右的Linux體驗、想獲得基本Linux技術資格的個人。yjbys小編收集了一些關於Linux運維工程師面試題庫,歡迎大家參考!Linux磁盤及軟件管理操作1.如何添加一塊新...
-
linux shell編程對變量的賦值
shell對變量的賦值,所有的.變量都是由字符串組成,不需要對變量名預先聲明,而且有很多關鍵字供編程者使用。下面列舉例子詳細説明。在終端下建立文件#vi#!/bin/sh#setavariableaa="helloworld"#printaecho"Ais:"echo$a在這個程序當中,可以看到shell編程與C編程的區...
-
Linux shell常用命令彙總
對於經常使用linux系統的博主來説,基本常用的shell命令是少不了的,下面yjbys為大家總結了Linuxshell的常用命令,希望對大家有所幫助!1.檢查遠程端口是否對bash開放:echo>/dev/tcp/&&echo"open"2.讓進程轉入後台:Ctrl+z3、將進程轉到前台:fg4.產生隨機的十六...