Chinaunix首页 | 论坛 | 博客
  • 博客访问: 71768
  • 博文数量: 28
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 291
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-29 14:47
文章存档

2014年(13)

2013年(15)

我的朋友

分类: C/C++

2013-12-13 17:19:25

一个进程在调用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;
}
阅读(1333) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~