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