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 首先我们要明白,为什么要避免僵 ...
随机推荐
- Guest Speaker on 2015 WinHEC Shenzhen 秋季大会
继今年3月份的WinHEC春季大会,秋季大会于11月10日-11日深圳如期举行.此次大会的主题是Windows 10 IoT和Microsoft Azure,云和端的无缝连接是微软物联网解决方案的典型 ...
- mvc页面跳转
用例列举: RedirectToAction: return RedirectToAction("PublicPreview", controllerName, new { id ...
- ajax请求技术
1.写在前面: 阅读要求: 具有一定的HTML.CSS.JavaScript.Json基础 2.什么是ajax Ajax:即”Asynchronous Javascript And XML”(异步Ja ...
- Redis时延问题分析及应对
Redis时延问题分析及应对 Redis的事件循环在一个线程中处理,作为一个单线程程序,重要的是要保证事件处理的时延短,这样,事件循环中的后续任务才不会阻塞: 当redis的数据量达到一定级别后(比如 ...
- linux 命令行中常用光标移动快捷键
对linux不怎么熟悉,以前在linux中敲命令的时候,要移动光标,傻傻的一个一个的移动,感觉特不爽.有几个常用的快捷键. ctrl+左右键:在单词之间跳转 ctrl+a:跳到本行的行首 ctrl+e ...
- 自定义shiro的Realm实现和CredentialsMatcher实现以及Token实现
Realm是shiro比较核心的接口,简单说它的实现类就是校验用户输入的账号信息的地方.如果想自定义实现一般的配置文件如下: <!--自定义Realm 继承自AuthorizingRealm - ...
- linux下的守护进程daemon
什么是守护进程?其实感觉守护进程并没有什么明确的定义,只是守护进程有一些特征,这是它需要遵循的. 守护进程的第一个特征是长时间在后台运行的程序,并且主要是为了提供某种服务,而为了能够让服务尽可能随时都 ...
- 1、策略模式(Strategy)
//抽象接口 class ReplaceAlgorithm { public: ; }; //三种具体的替换算法 class LRU_ReplaceAlgorithm : public Replace ...
- NOIP模拟赛20161016R2
Problem 1 护花(flower.cpp/c/pas) [题目描述] 约翰留下他的N(N<=100000)只奶牛上山采木.他离开的时候,她们像往常一样悠闲地在草场里吃草.可是,当他回来的时 ...
- [No000054] Windows 下Python3.5, NoteBook增强版安装
接着上周继续,没看的童鞋.请移步: http://www.cnblogs.com/Chary/p/No00004B.html 这里,假设你已经能够看到这个画面了: 接下来,我们继续 给药 : 安装no ...