当子进程退出时,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止)

  子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程。它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态。父进程查询子进程的退出状态可以用wait/waitpid函数。

wait函数: pid_t  wait(int  *status)  函数参数:status 该函数可以获得等待子进程的信息。返回值:子include<unistd.h>

#include<sys/wait.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<signal.h> #define ERR_EXIT(m)\
do\
{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0) int main(int argc,char *argv[]){
pid_t pid;
pid=fork();
if(pid == -1)
ERR_EXIT("fork error");
if(pid == 0){
printf("this is child\n");
//exit(100);
     abort();
}
printf("this is parent\n");
int status,ret;
ret=wait(&status);//等待子进程退出
   printf("ret = %d,pid = %d\n",ret,pid);
   if (WIFEXITED(status))
      printf("child exited normal. exit status=%d\n",WEXITSTATUS(status));
   else
      printf("child exited
abnormal\n");
return 0;
}

wait系统调用会使父进程暂停执行,直到它的一个子进程结束为止。返回的是子进程的PID,它通常是结束的子进程。状态信息允许父进程判定子进程的退出状态,即从子进程的main函数返回的值或子进程中exit语句的退出码。如果status不是一个空指针,状态信息将被写入它指向的位置。

waitpid函数:pid_t waitpid(pid_t pid, int *status, int options); 函数功能:用来等待某个特定进程的结束。

参数:status:若不为空,会把状态信息写到它指向的位置;options允许改变waitpid的行为,最有用的一个选项是WNOHANG,它的作用是防止waitpid把调用者的执行挂起。

参数中pid的值可以是:

1、<-1:等待的子进程的进程组ID等于(-pid)   pid的绝对值。

2、-1: waitpid(-1, &status, 0)  等价于  wait(&status);

3、0: 等待的子进程的进程组ID等于调用进程的进程组ID(同一个进程组)

4、>0:表示等待子进程号码为pid的进程的退出(等待特定子进程)

wait与waitpid的区别:

  在一个子进程终止前,wait使其调用者阻塞;而waitpid有一个选项,可使调用者不阻塞。

waitpid并不等待第一个终止的子进程——它有若干个选择项,可以控制它所等待的特定进程。实际上,wait函数是waitpid函数的一个特例。

僵尸进程:

  当一个子进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束,或者父进程调用了wait才终止;

  进程表中,代表子进程地数据项是不会立刻释放地,虽然不再活跃了,可子进程还停留在系统里。因为它的退出码还是需要保存起来以备父进程中后续地wait调用。它被称为一个“僵进程”。

如何避免僵尸进程:

1、调用wait或者waitpid函数,查询子进程退出状态,才方法父进程会被挂起;

2、如果不想让父进程挂起,可以在父进程中加入一条语句:signal(SIGCHLD,SIG_IGN);表示父进程忽略SIGCHLD信号,该信号是子进程退出地时候向父进程发送的。

wait函数与waitpid函数(僵尸进程)的更多相关文章

  1. 【Linux】僵尸进程,孤儿进程以及wait函数,waitpid函数(有样例,分析很详细)

    本文内容: 1.僵尸进程,孤儿进程的定义,区别,产生原因,处理方法 2.wait函数,waitpid函数的分析,以及比较 背景:由于子进程的结束和父进程的运行是一个异步的过程,即父进程永远无法预测子进 ...

  2. linux多进/线程编程(3)——wait、waitpid函数和孤儿、僵尸进程

    当使用fork创建多个进程后,需要解决子进程回收的问题.wait和waitpid函数就是做这个工作的. 假设子进程没有合理的回收,可能会带来两个问题: 1.孤儿进程(父进程挂了,子进程活着),孤儿进程 ...

  3. 进程——wait与waitpid、僵尸进程与孤儿进程

    僵尸进程:子进程终止了,但是父进程没有回收子进程的资源PCB.使其成为僵尸进程 孤儿进程:父进程先与子进程结束了,使得子进程失去了父进程,这个时候子进程会被1号进程init进程领养,成为孤儿进程 为了 ...

  4. wait/waitpid函数与僵尸进程、fork 2 times

    一.僵尸进程 当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程, ...

  5. wait 和waitpid函数对比-(转自 wintree)

    Wait和waipid函数 当一个进程正常或异常终止的时候,内核就像其父进程发送SIGCHLD信号,因为子进程是个一步事件,所以这种信号也是内核系那个父进程发的异步通知.父进程可以选择忽略该信号,或者 ...

  6. linux 如何清理僵尸进程

    今天在维护服务器的时候,发现有5个nova-novncproxy的僵尸进程. 26327 ?        S      0:05  \_ /usr/bin/python /usr/bin/nova- ...

  7. top对僵尸进程的处理

    ps        --forest        ASCII art process tree 2 怎样来清除僵尸进程:    1.改写父进程,在子进程死后要为它收尸.具体做法是接管SIGCHLD信 ...

  8. Linux下杀僵尸进程办法

    1) 检查当前僵尸进程信息 # ps -ef | grep defunct | grep -v grep | wc -l 175 # top | head -2 top - 15:05:54 up 9 ...

  9. linux下的僵尸进程处理SIGCHLD信号

    什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该 ...

随机推荐

  1. jvm堆内存和GC简介

    最近经常遇到jvm内存问题,觉得还是有必要整理下jvm内存的相关逻辑,这里只描述jvm堆内存,对外内存暂不阐述. jvm内存简图 jvm内存分为堆内存和非堆内存,堆内存分为年轻代.老年代,非堆内存里只 ...

  2. hdfs的JAVA必会操作

    hdfs的必会操作 创建目录 //创建目录 public static void mkdir(String filePath) throws URISyntaxException, IOExcepti ...

  3. MeteoInfoLab脚本示例:FY-3A AOD HDF数据

    FY3A卫星有HDF格式的AOD产品数据,全球范围,分辨率为0.05度.读取数据文件变量后要重新设定X/Y维,数据是Y轴反向的,且需要除以10000得到AOD值. 脚本程序: #Add data fi ...

  4. 什么是C和C++标准——小白必看

    本文简要介绍编写C/C ++应用程序的领域,标准库的作用以及它是如何在各种操作系统中实现的. 我已经接触C++一段时间了,一开始就让我感到疑惑的是其内部结构:我所使用的内核函数和类从何而来? 谁发明了 ...

  5. 想买保时捷的运维李先生学Java性能之 运行时数据区域

    前言 不知道自己不知道,不知道自己知道,知道自己不知道,知道自己知道,目前处于知道自己不知道这个阶段,很痛苦啊,干了4年了运维,是一个坎.越来越发觉想要走得远,还是得扎根底.   一.运行时数据区域 ...

  6. Django( 学习第三部 Django的url路由层)

    目录 url路由层 路由匹配(有名分组与无名分组) 反向解析 路由分发 名称空间(了解) Django版本区别 url 路由匹配 注意事项: url方法,第一个参数是正则表达式,只要第一个参数能够匹配 ...

  7. 学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳

    学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳 ...

  8. DiskLruCache和Lrucache缓存bitmap

    三级缓存,先在内存Lrucache中查找缓存,没有就去外存DiskLrucache中查找,再没有就下载,Lru不会自动删除,所以要设置最大缓存内存,后台运行Lrucache不会消失,关闭程序Diskl ...

  9. 关于linux epoll的了解

    使用select/poll模型假设一台服务器需要支持100w的并发连接,在_FD_SETSIZE为1024时,则至少需要1k个进程 除了进程间的上下文切换的时间消耗外,从内核/用户空间,大量的无脑内存 ...

  10. vue组件使用name属性来生成递归组件

    先来个简单的数据 1 lists = [{ 2 id: 1, 3 title: '第一层', 4 children: [{ 5 id: 3, 6 title: '第二层', 7 children: [ ...