IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 孤兒進程和僵尸進程

孤兒進程和僵尸進程 時間:2018-08-15      來源:未知

前段時間,由于研究經典面試題,把孤兒進程和僵尸進程也總結了一下。

我們有這樣一個問題:孤兒進程和僵尸進程,怎么產生的?有什么危害?怎么去預防?

下面是針對此問題的總結與概括。

一.產生的原因

1) 一般進程

正常情況下:子進程由父進程創建,子進程再創建新的進程。父子進程是一個異步過程,父進程永遠無法預測子進程的結束,所以,當子進程結束后,它的父進程會調用wait()或waitpid()取得子進程的終止狀態,回收掉子進程的資源。

2)孤兒進程

孤兒進程:父進程結束了,而它的一個或多個子進程還在運行,那么這些子進程就成為孤兒進程(father died)。子進程的資源由init進程(進程號PID = 1)回收。

3)僵尸進程

僵尸進程:子進程退出了,但是父進程沒有用wait或waitpid去獲取子進程的狀態信息,那么子進程的進程描述符仍然保存在系統中,這種進程稱為僵死進程。

二.問題危害

注意:unix提供了一種機制保證父進程知道子進程結束時的狀態信息。

這種機制是:在每個進程退出的時候,內核會釋放所有的資源,包括打開的文件,占用的內存等。但是仍保留一部分信息(進程號PID,退出狀態,運行時間等)。直到父進程通過wait或waitpid來取時才釋放。

但是這樣就會產生問題:如果父進程不調用wait或waitpid的話,那么保留的信息就不會被釋放,其進程號就會被一直占用,但是系統所能使用的進程號是有限的,如果大量產生僵死進程,將因沒有可用的進程號而導致系統無法產生新的進程,這就是僵尸進程的危害

孤兒進程是沒有父進程的進程,它由init進程循環的wait()回收資源,init進程充當父進程。因此孤兒進程并沒有什么危害。

補充:任何一個子進程(init除外)在exit()之后,并非馬上就消失掉,而是留下一個稱為僵尸進程的數據結構,等待父進程去處理。如果父進程在子進程exit()之后,沒有及時處理,出現僵尸進程,并可以用ps命令去查看,它的狀態是“Z”。

三.解決方案

1)kill殺死元兇父進程(一般不用)

嚴格的說,僵尸進程并不是問題的根源,罪魁禍首是產生大量僵死進程的父進程。因此,我們可以直接除掉元兇,通過kill發送SIGTERM或者SIGKILL信號。元兇死后,僵尸進程進程變成孤兒進程,由init充當父進程,并回收資源。

或者運行:kill -9 父進程的pid值、

2)父進程用wait或waitpid去回收資源(方案不好)

父進程通過wait或waitpid等函數去等待子進程結束,但是不好,會導致父進程一直等待被掛起,相當于一個進程在干活,沒有起到多進程的作用。

3)通過信號機制,在處理函數中調用wait,回收資源

通過信號機制,子進程退出時向父進程發送SIGCHLD信號,父進程調用signal(SIGCHLD,sig_child)去處理SIGCHLD信號,在信號處理函數sig_child()中調用wait進行處理僵尸進程。什么時候得到子進程信號,什么時候進行信號處理,父進程可以繼續干其他活,不用去阻塞等待。

例子1:

#include

#include

#include

#include

#include

static void sig_child(int signo);

int main()

{

pid_t pid;

//創建捕捉子進程退出信號

signal(SIGCHLD,sig_child);

pid = fork();

if (pid < 0)

{

perror("fork error:");

exit(1);

}

else if (pid == 0)

{

printf("I am child process,pid id %d.I am exiting.\n",getpid());

exit(0);

}

printf("I am father process.I will sleep two seconds\n");

//等待子進程先退出

sleep(2);

//輸出進程信息

system("ps -o pid,ppid,state,tty,command");

printf("father process is exiting.\n");

return 0;

}

static void sig_child(int signo)

{

pid_t pid;

int stat;

//處理僵尸進程

while ((pid = waitpid(-1, &stat, WNOHANG)) >0)

printf("child %d terminated.\n", pid);

}

4)fork兩次

fork兩次,父進程fork一個子進程,子進程在fork出一個孫子進程,然后子進程立馬退出,并由父進程去wait回收,這個過程不需要等待,然后父進程可以去干其他的活。孫子進程因為子進程退出會成為孤兒進程,那它可以由init充當父進程,并回收。這樣父進程和孫子進程就可以同時干活,互不影響,就實現了多進程。

例子2:

#include

#include

#include

#include

int main()

{

pid_t pid;

//創建第一個子進程

pid = fork();

if (pid < 0)

{

perror("fork error:");

exit(1);

}

//第一個子進程

else if (pid == 0)

{

//子進程再創建子進程

printf("I am the first child process.pid:%d\tppid:%d\n",getpid(),getppid());

pid = fork();

if (pid < 0)

{

perror("fork error:");

exit(1);

}

//第一個子進程退出

else if (pid >0)

{

printf("first procee is exited.\n");

exit(0);

}

//第二個子進程

//睡眠3s保證第一個子進程退出,這樣第二個子進程的父親就是init進程里

sleep(3);

printf("I am the second child process.pid: %d\tppid:%d\n",getpid(),getppid());

exit(0);

}

//父進程處理第一個子進程退出

if (waitpid(pid, NULL, 0) != pid)

{

perror("waitepid error:");

exit(1);

}

exit(0);

return 0;

}

四.補充測試程序

1)孤兒進程測試程序

#include

#include

#include

#include

int main()

{

pid_t pid;

//創建一個進程

pid = fork();

//創建失敗

if (pid < 0)

{

perror("fork error:");

exit(1);

}

//子進程

if (pid == 0)

{

printf("I am the child process.\n");

//輸出進程ID和父進程ID

printf("pid: %d\tppid:%d\n",getpid(),getppid());

printf("I will sleep five seconds.\n");

//睡眠5s,保證父進程先退出

sleep(5);

printf("pid: %d\tppid:%d\n",getpid(),getppid());

printf("child process is exited.\n");

}

//父進程

else

{

printf("I am father process.\n");

//父進程睡眠1s,保證子進程輸出進程id

sleep(1);

printf("father process is exited.\n");

}

return 0;

}

2)僵尸進程測試程序1

int main()

{

pid_t pid;

pid = fork();

if (pid < 0)

{

perror("fork error:");

exit(1);

}

else if (pid == 0)

{

printf("I am child process.I am exiting.\n");

exit(0);

}

printf("I am father process.I will sleep two seconds\n");

//等待子進程先退出

sleep(2);

//輸出進程信息

system("ps -o pid,ppid,state,command");

printf("father process is exiting.\n");

return 0;

}

3)僵尸進程測試程序2

#include

#include

#include

#include

int main()

{

pid_t pid;

//循環創建子進程

while(1)

{

pid = fork();

if (pid < 0)

{

perror("fork error:");

exit(1);

}

else if (pid == 0)

{

printf("I am a child process.\nI am exiting.\n");

//子進程退出,成為僵尸進程

exit(0);

}

else

{

//父進程休眠20s繼續創建子進程

sleep(20);

continue;

}

}

return 0;

}

4)僵尸進程測試程序2--測試效果

運行可執行程序顯示:

I am a child process.

I am exiting.

I am a child process.

I am exiting.

I am a child process.

I am exiting.

I am a child process.

I am exiting.

I am a child process.

I am exiting.

I am a child process.

I am exiting.

Killed

開另外一個終端:

運行:

ps -a -o pid,ppid,state,cmd

顯示:(狀態Z代表僵尸進程)

S PID PPID CMD

S 3213 2529 ./pid1

Z 3214 3213 [pid1]

Z 3215 3213 [pid1]

Z 3219 3213 [pid1]

Z 3220 3213 [pid1]

Z 3221 3213 [pid1]

R 3223 3104 ps -a -o state,pid,ppid,cmd

用第一種方法,解決僵尸進程,殺死其父進程

運行:kill -9 3213

注意:僵尸進程無法用kill直接殺死,如kill -9 3214,再用上面命令去查看進程狀態,發現3214進程還在。

五. 參考文獻

//www.cnblogs.com/Anker/p/3271773.html

《unix環境高級編程》第八章

上一篇:Linux C中對json格式數組數據的生成與解析

下一篇:傳感器尺寸

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 温州合发模架科技有限公司| 上海云屹国际快递-承接化工品_液体_粉末_化妆品_食品_锂电池等国际快递业务 | 检重秤,液化气充装秤,滚筒电子秤,汽车衡厂家|上海越衡实业 | 无锡市恒威工业气体有限公司-工业高纯气体_高纯度特种气体 | 津南人才网_津南招聘网_求职找工作平台 | 济宁卡尔迪机械制造有限公司_铁路换枕机_升降驾驶室_挖机加高底盘_加长臂 | 银龙制冷—北京冷库工程建设安装公司!【20年专业制冷】 | 上饶建盛建设,建盛建设,上饶市建盛建设工程质量检测有限公司-房屋鉴定 | 上海眸社设计-上海专业的VI设计,宣传册设计,画册设计,折页设计公司 | 济宁卡尔迪机械制造有限公司_铁路换枕机_升降驾驶室_挖机加高底盘_加长臂 | 上海钧尚电器有限公司 - Faulhaber电机 AMETEK pittman电机 AMETEK ROTRON军用航空风机 Exlar电动缸 MAE电机 MCG电机 CP电动工具 马头工具 AMCI驱动器 直流电机 减速箱 直流伺服电机,无刷电机,直线电机 直流防爆电机 防爆电机 汽车助力转向电机 EPS电机 faulhaber motor faulhaber gearbox NANOTEC电机 ELWOOD电机 PHYTRON电机 EXLAR伺服电动缸 高力矩、高性能直流电机,音圈电机,风机,直流风机,航空风机 | 深圳市桃子自动化科技有限公司-点胶机_灌胶机_焊锡机_螺丝机_SCARA机器人 | 商标注册_北京商标注册费用_申请商标注册代理机构_北京商标注册公司- | 内衬不锈钢复合管,大口径内衬不锈钢复合钢管,双金属复合管,内衬不锈钢复合管厂家-江苏新澎 | 四川升降货梯厂家-提供高品质货梯产品-见田科技液压升降平台厂家 | 眉山净源居环保科技有限公司,眉山除甲醛公司,眉山甲醛治理,眉山保洁服务,眉山家政保洁,眉山家电维修 - 眉山净源居环保科技有限公司,眉山除甲醛公司,眉山甲醛治理,眉山保洁服务,眉山家政保洁,眉山家电维修 | 小型静音无油空压机价格-医用无油制氧空气压缩机-浙江盛源水润滑空压机制造有限公司 | 全自动贴标机厂家-深圳市优斯迪自动贴标机官网 | 佳龙食品集团|高端辣条领导品牌 加药装置-排油烟装置-工业滤水器-连云港灵动 | 饲料设备_饲料加工设备_饲料成套加工设备专业提供商-河南杰昌机械设备有限公司 | 临沂网站建设,临沂网站制作,临沂网络公司,临沂小程序开发,临沂网站设计,沂水网站建设,沂南网站建设,蒙阴网站建设,平邑网站建设,费县网站建设,兰陵网站建设,郯城网站建设,临沭网站建设,莒南网站建设,兰山网络公司 | 制砂机_制沙一体机_青石制沙机-华盛铭设备厂家 | 上海博驰建筑科技工程有限公司 | 面粉加工设备-面粉加工机械-面粉机组-面粉磨粉机-面粉机成套设备-河南粮院机械制造有限公司 | 液晶拼接屏_三星46寸/55寸/LG液晶拼接屏_深圳拼接墙厂家_电视大屏幕液晶拼接_高清工业级液晶监视器 | 射频导纳物位开关|雷达液位计|安全光栅光幕传感器|音叉料位开关|两级跑偏开关|双向拉绳开关|纵向撕裂保护装置-山东卓信机械有限公司 | 水处理设备厂家_纯净水设备_超纯水设备价格找西安瑞泉水处理 | 无锡市一格机械设备有限公司【官网】| 易众拍卖行-事故车拍卖,残值车拍卖,水淹车拍卖,全损车拍卖,修复车拍卖,碰橦车拍卖,瑕疵车拍卖,报废车拍卖,泡水车拍卖,拆车件拍卖,配件拍卖,火烧车拍卖,二手车拍卖专业线上平台 | 江苏德邦化学工业集团有限公司 | 上海礼品公司_定制商务礼品_促销礼品_福利礼品_创意礼品_上海普田商贸有限公司 | 久久91精品久久91综合_国产亚洲自拍一区_国产精品第1页_亚洲高清视频一区_91成人午夜在线精品_亚洲国产精品网站在线播放_亚洲国产成人久久综合区_国产精品亚洲专区在线观看_免费视频精品一区二区三区 | 太阳能光伏发电_太阳能热水器_空气能热水器_直饮净水器_深圳市大兴节能环保科技有限公司 | 深圳市佳顺优印印刷有限公司,佳顺优印,画册印刷,海报印刷,封套印刷,手提袋印刷,包装盒印刷,彩盒印刷,无碳纸印刷,不干胶印刷,信封印刷,便笺印刷,笔记本印刷,台历印刷,挂历印刷,国际会展中心附近印刷厂,宝安印刷厂,宝安教材印刷厂 | 紫铜箔(带)导电胶带定做,定做紫铜箔(带)导电胶带厂家[价格]-艾飞敏铜箔 | 洗车机-自动汽车洗车机-全自动洗车设备-全自动电脑洗车机-北京自然绿环境科技发展有限公司 | 苏州不锈钢_江苏不锈钢_江苏不锈钢板_苏州模具钢_苏州合金钢_苏州特种合金_苏州不锈钢板_304不锈钢棒_苏州塞硒五金制品有限公司 苏州ERP定制|苏州CRM|苏州OA|苏州BPM|进销存管理系统-苏州中尚信息科技有限公司 | 天津高压泵-高压清洗机-高压柱塞泵-厂家-价格-天津高压泵格瑞德 天津翻译公司盖章|022-58385822| 翰文博译(天津)商务咨询有限公司 | 扫路车_洗扫车_清扫车_道路清扫车_天锦洗扫车-程力专用汽车股份有限公司 | 山东淄博海杰化工有限公司-淄博海杰化工_NP-10、OP-10、吐温80、司盘80、磺酸、油酸等乳化剂 | 儒亚科技_磁悬浮天平,竞争吸附,高压热重,重量法高压,高压密度 |