Posted on 2009-03-13 20:13
Prayer 閱讀(364)
評論(0) 編輯 收藏 引用 所屬分類:
LINUX/UNIX/AIX
僵尸進程:一個子進程在其父進程還沒有調用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 (回車后將會進入#) #
|