wait函数与waitpid函数(僵尸进程)
当子进程退出时,内核会向父进程发送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函数(僵尸进程)的更多相关文章
- 【Linux】僵尸进程,孤儿进程以及wait函数,waitpid函数(有样例,分析很详细)
本文内容: 1.僵尸进程,孤儿进程的定义,区别,产生原因,处理方法 2.wait函数,waitpid函数的分析,以及比较 背景:由于子进程的结束和父进程的运行是一个异步的过程,即父进程永远无法预测子进 ...
- linux多进/线程编程(3)——wait、waitpid函数和孤儿、僵尸进程
当使用fork创建多个进程后,需要解决子进程回收的问题.wait和waitpid函数就是做这个工作的. 假设子进程没有合理的回收,可能会带来两个问题: 1.孤儿进程(父进程挂了,子进程活着),孤儿进程 ...
- 进程——wait与waitpid、僵尸进程与孤儿进程
僵尸进程:子进程终止了,但是父进程没有回收子进程的资源PCB.使其成为僵尸进程 孤儿进程:父进程先与子进程结束了,使得子进程失去了父进程,这个时候子进程会被1号进程init进程领养,成为孤儿进程 为了 ...
- wait/waitpid函数与僵尸进程、fork 2 times
一.僵尸进程 当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程, ...
- wait 和waitpid函数对比-(转自 wintree)
Wait和waipid函数 当一个进程正常或异常终止的时候,内核就像其父进程发送SIGCHLD信号,因为子进程是个一步事件,所以这种信号也是内核系那个父进程发的异步通知.父进程可以选择忽略该信号,或者 ...
- linux 如何清理僵尸进程
今天在维护服务器的时候,发现有5个nova-novncproxy的僵尸进程. 26327 ? S 0:05 \_ /usr/bin/python /usr/bin/nova- ...
- top对僵尸进程的处理
ps --forest ASCII art process tree 2 怎样来清除僵尸进程: 1.改写父进程,在子进程死后要为它收尸.具体做法是接管SIGCHLD信 ...
- Linux下杀僵尸进程办法
1) 检查当前僵尸进程信息 # ps -ef | grep defunct | grep -v grep | wc -l 175 # top | head -2 top - 15:05:54 up 9 ...
- linux下的僵尸进程处理SIGCHLD信号
什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该 ...
随机推荐
- 2020年在项目中使用MVVM正确姿势,你用对了吗?
最近看到了几篇与 Jetpack MVVM 有关到文章,使我不禁也想淌一下这场混水.我是在 2017 年下半年接触的 Jetpack 的那套开发工具,并且后来一直将其作为开发的主要框架.在这段时间的使 ...
- day40 Pyhton 并发编程03
一.内容回顾 进程是计算机中最小的资源分配单位 进程与进程之间数据隔离,执行过程异步 为什么会出现进程的概念? 为了合理利用cpu,提高用户体验 多个进程是可以同时利用多个cpu的,可以实现并行的效果 ...
- elasticsearch练习
elasticsearch练习 最近在学习elasticsearch,做了一些练习,分享下练习成果,es基于6.7.2,用kibana处理DSL,有兴趣的伙伴可以自己试试 1.简单查询练习 sourc ...
- 【Linux编译环境的搭建】Linux都没有,怎么学Linux编程?
本文准备从0开始,一步步搭建一套属于自己的多节点Linux系统环境,这将是后续学Linux.用Linux.Linux环境编程.应用和项目部署.工具实验等一系列学习和实践的基石,希望对小伙伴们有帮助. ...
- spring cloud:通过client访问consul集群(spring cloud hoxton sr8 / spring boot 2.3.4)
一,为什么要搭建consul的client? 1,网上的很多资料,访问consul时用的单机模式,这样是不可以直接在生产环境中使用的 还有一些资料,搭建了consul的集群后,直接访问集群中的某一个i ...
- swoft 使用协程 初试
控制器访问 /hi /** * @Swoft\Bean\Annotation\Mapping\Inject("UserService") * @var UserService */ ...
- centos8平台使用nethogs基于进程监控网络流量
一,nethogs的作用: 按进程或程序实时统计网络带宽使用率 我们查看流量的占用时,知道来源的ip.访问的端口,还不足以帮我们确认到进程, 而nethogs则可以让我们查看每个进程所占用的流量带宽 ...
- HTML语义化罗嗦罗嗦
CSS还未诞生之前,为了实现一些样式效果.设计师必须使用一些物理标签,例如font.b等.这样会造成页面中充满了为实现各种样式的标签,特别是使用table标签来实现一些特殊的布局,俗称为"标 ...
- 在VMware虚拟机Ubuntu使用traceroute
Linux traceroute命令用于显示数据包到主机间的路径 traceroute指令让你追踪网络数据包的路由途径,预设数据包大小是40Bytes,用户可另行设置. Ubuntu命令行输入: 后面 ...
- day71:drf:API接口&Restful API规范&Django Rest Framework&drf中的序列化和反序列化功能
目录 1.web应用模式 2.API接口 3.Restful API规范 4.序列化 5.Django Rest Framework 1.drf的简单介绍 2.drf的特点 3.如何安装drf 4.d ...