2次使用fork避免产生僵尸进程和不去处理SIGCHLD信号
1.如下代码所示
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h> int main(int argc,char *argv[])
{
pid_t child = fork(); if( child == - ) { //error
printf("\nfork child error.");
exit();
} else if(child == ){
//exit(0);
if ((child = fork()) < )
printf("fork error\n");
else if (child > )
{
// sleep(3);
exit();
}
sleep();
printf("second child,parent pid %d\n",getppid());
exit();
}
// sleep(3);
if (waitpid(child,NULL,) != child)
printf("waitpid error\n");
sleep();
exit();
//sleep(600); }
1个终端使用gcc -g test.c -o test 生成test程序后,准备执行。
另1个终端不断敲击命令ps lfx | grep test,其中第3列显示pid,第4列显示ppid。
可以看到另1个终端显示:
0 0 28787 20574 20 0 3920 340 hrtime S+ pts/1 0:00 | \_ ./test
0 0 28792 20817 20 0 103248 828 pipe_w S+ pts/2 0:00 \_ grep test
1 0 28789 1 20 0 3920 140 hrtime S+ pts/1 0:00 ./test
其中第3行为我们第二次fork的子进程,其ppid已为1(即init进程)
第1行的test进程为主进程在sleep(10),达到了咱们的目的。
2.这里主要探讨下waitpid在这里的用法
作用:回收第1个fork产生的子进程,这里的代码显示这个子进程产生后马上调用exit。
3.疑惑:fork函数后父子进程的先后执行顺序不定,waitpid总能成功收回吗?
在这里做2个实验,
第一次把代码中第20行sleep(3);解除注释,运行,观察结果。(主进程waitpid执行后产生僵尸进程)
第二次把代码中第27行sleep(3);解除注释,运行,观察结果。(主进程waitpid执行前产生僵尸进程)
可见2次实验中最后都没有僵尸进程,说明都成功收回了。
第2次实验中僵尸进程大概存在了3秒左右,是由于第27行的sleep(3).
可见次代码中主进程的waitpid总能把第一次fork的子进程成功收回。
2次使用fork避免产生僵尸进程和不去处理SIGCHLD信号的更多相关文章
- linux下的僵尸进程处理SIGCHLD信号
什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该 ...
- [转] linux下的僵尸进程处理SIGCHLD信号
什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些 信息至少包括进程ID,进程的终止状态,以及 ...
- [linux]孤儿进程与僵尸进程
转载自:http://www.cnblogs.com/Anker/p/3271773.html 一.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两 ...
- linux下的僵尸进程处理SIGCHLD信号【转】
转自:http://www.cnblogs.com/wuchanming/p/4020463.html 什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打 ...
- linux处理僵尸进程
由来 在linux下,如果一个进程终止,内核会释放该进程使用的所有存储区,关闭所有文件句柄等,但是,内核会为每个终止子进程保留一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该进程使用的C ...
- PHP 中的僵尸进程、孤儿进程详解
僵尸进程 当子进程运行结束,父进程仍然继续运行,但父进程没有对子进程进行回收,释放子进程占用的资源,此时子进程就成为了一个僵尸进程. 在Unix进程管理中,如果新开的子进程运行结束,父进程将会收到一个 ...
- python练习笔记——利用信号signal处理僵尸进程
1 signal处理僵尸进程的基于语法 利用信号signal处理僵尸进程的方法:signal(SIGCHLD,SIG_IGN),该方法也是第三种处理僵尸进程的方法. SIGCHLD:子进程状态改变后产 ...
- 【转】Linux杀死fork产生的子进程的僵尸进程defunct
僵尸进程 就是 已经结束,但是还没有清理出去的.用kill -9 $PID 也无法杀死. 所以程序中应该避免出现僵尸进程. 用fork之后,父进程如果没有wait /waitpid 等待子进程的话,子 ...
- 为何要fork()两次来避免产生僵尸进程??
最近安装书上说的,开始搞多进程了..看到了一个好帖子,学习学习 http://blog.sina.com.cn/s/blog_9f1496990100y420.html 首先我们要明白,为什么要避免僵 ...
随机推荐
- [20141121]无法通过powershell读取sql server性能计数器问题
背景: 全新服务器,需要增加性能监控,发现无法通过powershell读取性能指标 解决方法: Open the Registry Editor by going to the Start Menu ...
- Tomcat:配置SSL
SSL简述 SSL就是安全套接字层,是一种允许web浏览器和 web服务器通过安全连接通信的技术.这是一个双向的过程,这意味着 服务器和浏览器在发送数据之前加密所有交流的数据. SSL有一个重要的特点 ...
- Ambari server:无法显示内存,CPU等使用率
Ambari server安装完毕后,都能正确显示各种信息.运行了几天后,发现无法显示内存,CPU等信息. 查找日志发现有错误,日志路径:/var/log/ambari-server/ambari-s ...
- Python魔术方法-Magic Method
介绍 在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",例如类的初始化方法 __init__ ,Python中所有的魔 ...
- PHP笔记(PHP初级篇)
学习完HTML和CSS后,终于要开始学习PHP啦!前面的铺垫只为后路的畅顺! PHP环境搭建: 企业中常用到的环境是:Linux+Apache+MySQL+PHP 学习环境是:Windows+Apac ...
- Spark基本工作流程及YARN cluster模式原理(读书笔记)
Spark基本工作流程及YARN cluster模式原理 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark基本工作流程 相关术语解释 Spark应用程序相关的几 ...
- android 尽量不要使用static静态变量
使用静态static静态变量潜在性问题: 1.占用内存,并且内存一般不会释放: 2.在系统不够内存情况下会自动回收静态内存,这样就会引起访问全局静态错误. 3.不能将activity作为static静 ...
- ajax缓存问题
默认情况下,请求总会被发出去,但浏览器有可能从它的缓存中调取数据.换句话说,在缓存过期之前,针对相同地址发起的多个Ajax请求,只有第一次会真正发送到服务端.要禁止使用缓存的结果,可以设置 cache ...
- 虚拟机装系统出现 ntldr is missing(NTLDR丢失)、无法正常开机、解决方法
虚拟机(VMware Workstation或Hyper-V)装ghost版系统提示“ntldr is missing Press Ctrl+Alt+del to Resta 此方法对实体机.虚拟机安 ...
- .NET 响应式自动缩略图服务器
做互联网网站,总是会涉及到缩略图问题,之前一直是在上传图片时生成不同尺寸的缩略图,一直感觉又费力又不好管理,之后就写子 ThumbnailServer 用于部署一个图片服务器,在使用图片时才将图片转为 ...