有關(guān)僵尸進(jìn)程和孤兒進(jìn)程的解釋
僵尸進(jìn)程:一個(gè)子進(jìn)程在其父進(jìn)程還沒(méi)有調(diào)用wait()或waitpid()的情況下退出。這個(gè)子進(jìn)程就是僵尸進(jìn)程。
孤兒進(jìn)程:一個(gè)父進(jìn)程退出,而它的一個(gè)或多個(gè)子進(jìn)程還在運(yùn)行,那么那些子進(jìn)程將成為孤兒進(jìn)程。孤兒進(jìn)程將被init進(jìn)程(進(jìn)程號(hào)為1)所收養(yǎng),并由init進(jìn)程對(duì)它們完成狀態(tài)收集工作。
僵尸進(jìn)程將會(huì)導(dǎo)致資源浪費(fèi),而孤兒則不會(huì)。
子進(jìn)程持續(xù)10秒鐘的僵尸狀態(tài)(EXIT_ZOMBIE)
------------------------------------------------------
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
main()
{
pid_t pid;
pid = fork();
if(pid < 0)
printf("error occurred!"n");
else if(pid == 0) {
printf("Hi father! I'm a ZOMBIE"n");
exit(0); //(1)
}
else {
sleep(10);
wait(NULL); //(2)
}
}
(1) 向父進(jìn)程發(fā)送SIGCHILD信號(hào)
(2) 父進(jìn)程處理SIGCHILD信號(hào)
執(zhí)行exit()時(shí)根據(jù)其父進(jìn)程的狀態(tài)決定自己的狀態(tài):
如果父進(jìn)程已經(jīng)退出(沒(méi)有wait),則該子進(jìn)程將會(huì)成為孤兒進(jìn)程過(guò)繼給init進(jìn)程
如果其父進(jìn)程還沒(méi)有退出,也沒(méi)有wait(),那么該進(jìn)程將向父進(jìn)程發(fā)送SIGCHILD信號(hào),進(jìn)入僵尸狀態(tài)等待父進(jìn)程為其收尸。如果父進(jìn)程一直沒(méi)有執(zhí)行wait(),那么該子進(jìn)程將會(huì)持續(xù)處于僵尸狀態(tài)。
子進(jìn)程將成為孤兒進(jìn)程
------------------------------------------------------
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
main()
{
pid_t pid;
pid = fork();
if(pid < 0)
printf("error occurred!"n");
else if(pid == 0) {
sleep(6);
printf("I'm a orphan"n");
exit(0);
}
else {
sleep(1);
printf("Children Bye!"n");
}
}
# ./a.out
Children Bye!
# I'm a orphan
(回車(chē)后將會(huì)進(jìn)入#)
上面是我在網(wǎng)上找到的一篇簡(jiǎn)潔又清晰的有關(guān)僵尸/孤兒進(jìn)程的介紹,我再補(bǔ)充點(diǎn)自己的體會(huì):
任何一個(gè)進(jìn)程退出時(shí),都會(huì)給自己的父進(jìn)程發(fā)送一個(gè)SIGCHLD/SIGCLD,如果父進(jìn)程在創(chuàng)建子進(jìn)程之前調(diào)用了signal(SIGCHLD, SIG_IGN),那么子進(jìn)程將立刻退出,也就不存在什么僵尸進(jìn)程了;對(duì)于上面的第一個(gè)例子,假如在父進(jìn)程中sleep之后沒(méi)有調(diào)用wait,那么由子進(jìn)程發(fā)送過(guò)來(lái)的SIGCHLD信號(hào)也不會(huì)再拋給init進(jìn)程(即,不會(huì)從僵尸進(jìn)程轉(zhuǎn)化為孤兒進(jìn)程);
父親比孩子死得早,孩子就是孤兒進(jìn)程,因此孤兒進(jìn)程的開(kāi)始不是從子進(jìn)程exit后算的,而是從父進(jìn)程死亡的那一刻算的;
僵尸進(jìn)程的首要必要條件就是:父親得活著;其次,子進(jìn)程成為僵尸的時(shí)間長(zhǎng)度==父進(jìn)程不搭理子進(jìn)程的時(shí)間長(zhǎng)度(即, 不調(diào)用wait或waitpid)。
孤兒進(jìn)程:一個(gè)父進(jìn)程退出,而它的一個(gè)或多個(gè)子進(jìn)程還在運(yùn)行,那么那些子進(jìn)程將成為孤兒進(jìn)程。孤兒進(jìn)程將被init進(jìn)程(進(jìn)程號(hào)為1)所收養(yǎng),并由init進(jìn)程對(duì)它們完成狀態(tài)收集工作。
僵尸進(jìn)程將會(huì)導(dǎo)致資源浪費(fèi),而孤兒則不會(huì)。
子進(jìn)程持續(xù)10秒鐘的僵尸狀態(tài)(EXIT_ZOMBIE)
------------------------------------------------------
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
main()
{
pid_t pid;
pid = fork();
if(pid < 0)
printf("error occurred!"n");
else if(pid == 0) {
printf("Hi father! I'm a ZOMBIE"n");
exit(0); //(1)
}
else {
sleep(10);
wait(NULL); //(2)
}
}
(1) 向父進(jìn)程發(fā)送SIGCHILD信號(hào)
(2) 父進(jìn)程處理SIGCHILD信號(hào)
執(zhí)行exit()時(shí)根據(jù)其父進(jìn)程的狀態(tài)決定自己的狀態(tài):
如果父進(jìn)程已經(jīng)退出(沒(méi)有wait),則該子進(jìn)程將會(huì)成為孤兒進(jìn)程過(guò)繼給init進(jìn)程
如果其父進(jìn)程還沒(méi)有退出,也沒(méi)有wait(),那么該進(jìn)程將向父進(jìn)程發(fā)送SIGCHILD信號(hào),進(jìn)入僵尸狀態(tài)等待父進(jìn)程為其收尸。如果父進(jìn)程一直沒(méi)有執(zhí)行wait(),那么該子進(jìn)程將會(huì)持續(xù)處于僵尸狀態(tài)。
子進(jìn)程將成為孤兒進(jìn)程
------------------------------------------------------
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
main()
{
pid_t pid;
pid = fork();
if(pid < 0)
printf("error occurred!"n");
else if(pid == 0) {
sleep(6);
printf("I'm a orphan"n");
exit(0);
}
else {
sleep(1);
printf("Children Bye!"n");
}
}
# ./a.out
Children Bye!
# I'm a orphan
(回車(chē)后將會(huì)進(jìn)入#)
上面是我在網(wǎng)上找到的一篇簡(jiǎn)潔又清晰的有關(guān)僵尸/孤兒進(jìn)程的介紹,我再補(bǔ)充點(diǎn)自己的體會(huì):
任何一個(gè)進(jìn)程退出時(shí),都會(huì)給自己的父進(jìn)程發(fā)送一個(gè)SIGCHLD/SIGCLD,如果父進(jìn)程在創(chuàng)建子進(jìn)程之前調(diào)用了signal(SIGCHLD, SIG_IGN),那么子進(jìn)程將立刻退出,也就不存在什么僵尸進(jìn)程了;對(duì)于上面的第一個(gè)例子,假如在父進(jìn)程中sleep之后沒(méi)有調(diào)用wait,那么由子進(jìn)程發(fā)送過(guò)來(lái)的SIGCHLD信號(hào)也不會(huì)再拋給init進(jìn)程(即,不會(huì)從僵尸進(jìn)程轉(zhuǎn)化為孤兒進(jìn)程);
父親比孩子死得早,孩子就是孤兒進(jìn)程,因此孤兒進(jìn)程的開(kāi)始不是從子進(jìn)程exit后算的,而是從父進(jìn)程死亡的那一刻算的;
僵尸進(jìn)程的首要必要條件就是:父親得活著;其次,子進(jìn)程成為僵尸的時(shí)間長(zhǎng)度==父進(jìn)程不搭理子進(jìn)程的時(shí)間長(zhǎng)度(即, 不調(diào)用wait或waitpid)。
posted on 2010-08-25 14:52 so true 閱讀(1389) 評(píng)論(0) 編輯 收藏