僵尸進(jìn)程:一個子進(jìn)程在其父進(jìn)程還沒有調(diào)用wait()或waitpid()的情況下退出。這個子進(jìn)程就是僵尸進(jìn)程。
孤兒進(jìn)程:一個父進(jìn)程退出,而它的一個或多個子進(jìn)程還在運(yùn)行,那么那些子進(jìn)程將成為孤兒進(jìn)程。孤兒進(jìn)程將被init進(jìn)程(進(jìn)程號為1)所收養(yǎng),并由init進(jìn)程對它們完成狀態(tài)收集工作。 僵尸進(jìn)程將會導(dǎo)致資源浪費(fèi),而孤兒則不會。 子進(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信號 (2) 父進(jìn)程處理SIGCHILD信號 執(zhí)行exit()時根據(jù)其父進(jìn)程的狀態(tài)決定自己的狀態(tài): 如果父進(jìn)程已經(jīng)退出(沒有wait),則該子進(jìn)程將會成為孤兒進(jìn)程過繼給init進(jìn)程 如果其父進(jìn)程還沒有退出,也沒有wait(),那么該進(jìn)程將向父進(jìn)程發(fā)送SIGCHILD信號,進(jìn)入僵尸狀態(tài)等待父進(jìn)程為其收尸。如果父進(jìn)程一直沒有執(zhí)行wait(),那么該子進(jìn)程將會持續(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 (回車后將會進(jìn)入#) # |
只有注冊用戶登錄后才能發(fā)表評論。 | ||
【推薦】100%開源!大型工業(yè)跨平臺軟件C++源碼提供,建模,組態(tài)!
![]() |
||
相關(guān)文章:
|
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
|
||
|