signal(SIGCHLD, SIG_IGN);的使用及验证
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include<stdlib.h>
#include<signal.h>
int main(int argc , char **argv)
{signal(SIGCHLD, SIG_IGN);
int id;
id=fork();
if(id<)
{
printf("fork error\n");
}
else if(id==)
{
printf("I'm in child process%d parent process%d\n",getpid(),getppid());
exit();
}
else if(id>)
{
printf("I'm in parent process%d\n",getpid());
sleep();
}
//signal(SIGCHLD, SIG_IGN);
return ;
}
[root@linux Desktop]# gcc 僵尸进程.c
[root@linux Desktop]# ./a.out
I'm in parent process8072
I'm in child process8073 parent process8072 //第二行
[root@linux Desktop]#
在第二行输出后会阻塞大概1分钟,我们执行以下命令
[root@linux Desktop]# ps aux | grep 'Z'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 0.0 0.0 pts/ S+ : : grep Z
可以发现没有僵尸进程啊,感觉很奇怪吧!
这是因为init进程调用wait把子进程的进程表项等资源清理了!
为啥子进程没有成为僵尸进程而成为了init的子进程呢?
很奇怪吧!因为signal(SIGCHLD, SIG_IGN);这一行代码,所以子进程成为了init的子进程!
一定要注意signal(SIGCHLD, SIG_IGN);的位置,因为程序执行时,是从上面往下执行的,因为我们执行那些
命令时,这行代码还未执行,然而这时子进程已经成为了僵尸进程了!见下面
如果这行代码的位置在最后面,那么结果将是不一样的,下面就是执行结果:
[root@linux Desktop]# ps aux | grep -w 'Z'
root 0.0 0.0 pts/ Z+ : : [a.out] <defunct>
root 0.0 0.0 pts/ S+ : : grep -w Z
[root@linux Desktop]# 可以看出产生了僵尸进程! 我们可以用ps --ppid 1来查看父进程号为1的进程!(那个进程号都可以)
也可以用 ps --pid 来查看进程号为1的进程
[root@linux Desktop]# ps --pid
PID TTY TIME CMD
? :: init
但是我们一定要记住使用这些命令时,一定要记住在程序运行时,才能得到结果的!程序一旦结束是看不到的!
下面是一个例子,在一个窗口中
[root@linux Desktop]# ./a.out
I'm in parent process8853
I'm in child process8854 parent process8853//会停顿大概一分钟,为了能看清楚,
[root@linux Desktop]#
下面的要在另一个窗口看
[root@linux Desktop]# ps --pid
PID TTY TIME CMD
pts/ :: a.out
[root@linux Desktop]# ps --ppid
PID TTY TIME CMD
pts/ :: a.out
[root@linux Desktop]# ps --ppid
PID TTY TIME CMD //注意这儿没有输出任何结果,是因为程序执行结束了
[root@linux Desktop]#
一定要记住在程序正在运行时看,包括查看僵尸进程,因为一旦程序结束了,那么僵尸进程估计就看不到了!切记。。。
记住只要父进程不死,子进程(这里来说指的是僵尸进程),就不会被init进程接管,他会一直停在系统中占用资源,只有当父进程死的时候,内核才会去扫描看是否有子进程(包括僵尸进程),若果有然后将其子进程交给init进程接管!
signal(SIGCHLD, SIG_IGN);的使用及验证的更多相关文章
- signal(SIGCHLD, SIG_IGN)和signal(SIGPIPE, SIG_IGN);
signal(SIGCHLD, SIG_IGN); //忽略SIGCHLD信号,这常用于并发服务器的性能的一个技巧 //因为并发服务器常常fork很多子进程,子进程终结之后需要//服务器进程去wait ...
- 【转载】signal(SIGCHLD, SIG_IGN)和signal(SIGPIPE, SIG_IGN)
来源:https://blog.csdn.net/guotao1983/article/details/82118218 signal(SIGCHLD, SIG_IGN) 因为并发服务器常常fork很 ...
- signal(SIGPIPE, SIG_IGN)
文章来源:http://blog.163.com/niuxiangshan@126/blog/static/170596595201221942952676/ 当服务器close一个连接时,若cl ...
- signal(SIGPIPE, SIG_IGN) (转)
signal(SIGPIPE, SIG_IGN) 当服务器close一个连接时,若client端接着发数据. 根据TCP 协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会 ...
- signal(SIGPIPE, SIG_IGN)(转)
signal(SIGPIPE, SIG_IGN) 当服务器close一个连接时,若client端接着发数据.根据TCP 协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发 ...
- (win 7)使用puma以后,重启rails server报错: in `trap': unsupported signal SIGCHLD (ArgumentError)
如图: 解决方案: 把config/puma.rb 文件中的 workers Integer(ENV['WEB_CONCURRENCY'] || 2) 改成 workers Integer(ENV[' ...
- Linux 信号详解一(signal函数)
信号列表 SIGABRT 进程停止运行 SIGALRM 警告钟 SIGFPE 算述运算例外 SIGHUP 系统挂断 SIGILL 非法指令 SIGINT 终端中断 SIGKILL 停止进程(此信号不能 ...
- linux下的僵尸进程处理SIGCHLD信号
什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该 ...
- [转] linux下的僵尸进程处理SIGCHLD信号
什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些 信息至少包括进程ID,进程的终止状态,以及 ...
随机推荐
- java容器详细解析(转)
:在java开发中我们肯定会大量的使用集合,在这里我将总结常见的集合类,每个集合类的优点和缺点,以便我们能更好的使用集合.下面我用一幅图来表示 其中淡绿色的表示接口,红色的表示我们经常使用的类. 1: ...
- DevExpress控件之"XtraForm——窗体"
1.AutoScaleMode:确定当屏幕分辨率或字体更改时窗体或控件将如何缩放. Dpi:根据显示分辨率控制缩放.常用分辨率为96和120Dpi: Font:根据类使用的字体(通常为系统字体)的维度 ...
- unity 查看prefab层次
点那个箭头,可以展开:
- xtrabackup迁移单独一张INNODB表
- MFC程序开始的执行过程详述
1)我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用程序的窗口函数.而在MFC程 ...
- Javascript玩转继承(二)
对象伪装来实现继承.在这里先来说一下这种方式的优缺点 这种方式是比较容易理解的,在子类中调用父类的构造函数.另外,这种方法最大的一个优点就是说构造继承可以实现多继承,复习下这个代码: function ...
- javascript淡入淡出效果的实现思路
这个思路是最近写XScroll.js类的时候想明白的.平常我们说的淡入淡出效果,一般分成两部分,一半是淡入,另一半就是淡出了.不过经过分析,我觉得其实只需要一半就行了如题,只有思路,没有代码. 这个思 ...
- Remoting异步回调,向在线用户广播消息
本文目的:向Remoting在线客户端广播消息. 使用的主要技术:异步,回调,广播. 实现过程: 定义远程实例 using System; using System.Collections.Gener ...
- PHP 对 memcache操作类
<span style="font-size:18px;">class myMemcache { private $memcache; /** * 一般建议这2个值做成 ...
- keepalived openssl 报错
configure: error: !!! OpenSSL is not properly installed on your system. !!! !!! Can not include Open ...