Posted on 2009-03-13 20:13
Prayer 阅读(351)
评论(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 (回车后将会进入#) #
|