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,进程的终止状态,以及 ...
随机推荐
- [转载]windows7中没用boot.ini文件而是改用BCDEDIT来配置了
原文地址:windows7中没用boot.ini文件而是改用BCDEDIT来配置了作者:开心骝哥 本人安装的Win7,因为机上有两个系统,一个dos系统,一个win7系统,开机时总是会在系统选择的界面 ...
- windows named pipe 客户端 服务器
可以实现多客户端对一服务端,服务端为客户端提供服务. 其实一服务端对应每一个client pipe都新建立了一个pipe.windows允许建立多个同名pipe 效果: 服务端代码: #define ...
- HDUOJ----Good Numbers
Good Numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- 关于JavaScript中Get/Set访问器
有时候大家可能会纳闷,在使用JavaScript的时候,只需要给一个系统变量赋值就可以触发一系列操作去相应. 但是我们在写Js的时候,修改了一个自定义变量,却连个P都没有.是不是很郁闷呢? 其实,我们 ...
- 【jQuery】网上看到一个不错的登陆界面
预览截图如下: Html部分代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- EC20 minipcie版4g模块开发笔记
插在电脑上实验时若出现 AT+CREG? +CREG: 0,2 可能是usb口供电不足所致,换至主机箱后面usb口后问题解决,返回值+CREG: 0,1
- struts2 循环标签使用
struts2 counter循环标签的使用: struts2随提供了循环控制标签<s:iterator/>,,使用起来也比较方便,但在具体的应用中,也有不方便之处,他没有像struts1 ...
- PS图像菜单下计算命令
PS图像菜单下计算命令通过通道的混合模式得到的选区非常精细,从而调色的时候过度非常好.功能十分强大. 下面用计算命令中的"相加"和"减去"模式做实例解析,这 ...
- java Webservice(一)HttpClient远程调用
我们将Web Service发布在Tomcat或者其他应用服务器上后,有很多方法可以调用该Web Service,常用的有两种: 1.通过浏览器HTTP调用,返回规范的XML文件内容 2.通 ...
- 《Effective Java》读书笔记六(方法)
No38 检查参数的有效性 对于公有的方法,要用Javadoc的@throws标签(tag)在文档中说明违反参数值时会抛出的异常.这样的异常通常为IllegalArgumentException.In ...