一个进程在调用exit()函数结束自己的生命的时候,操作系统内核仍然会在进程表中为其保留一定的信息(包括进程号,退出状态,运行时间等)。
由于这类进程已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅继续占用了系统的进程表资源,除此之外不再占有任何的
内存空间,因此被称为僵尸进程。
僵尸进程的清除工作一般由其父进程来负责进行。当父进程通过调用wait()和waitpid()等函数来等待子进程结束,从而避免产生僵尸进程,
但这会导致父进程被挂起(即父进程被阻塞,处于等待状态)。
进程一旦调用了wait()函数,就立即阻塞自己,由wait()函数自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成
僵尸的子进程,wait()函数就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait函数就会一直阻塞在这里,
直到有这样一个子进程出现为止。如果wait()函数调用成功,将会返回被收集的子进程的进程ID,如果调用失败则返回-1.
#include
#include
#include
#include
#include
int main()
{
int status;
pid_t pc,pr;
pc=fork();
if(pc<0){
printf("fork failed");
exit(1);
}
else if(pc==0)
{
int i;
for(i=3;i>0;i--){
printf("this is the child\n");
sleep(5);
}
exit(4);
}
else{
pr=wait(&status);
if(WIFEXITED(status)){
printf("the child process %d exit normally.\n",pr);
printf("the weexitstatus return code is %d\n",WEXITSTATUS(status));
printf("the WIFEXITED return code is %d\n",WIFEXITED(status));
}else
printf("the child process %d exit adnormally.\n",pr);
printf("status is %d.\n",status);
}
return 0;
}
阅读(1375) | 评论(0) | 转发(0) |