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,进程的终止状态,以及 ...
随机推荐
- 学习Tkinter
tutorial point这个网站教程很多,无所不包.还包括一堆在线IDE,值得收藏 一.第一个tkinter程序 import tkinter top = tkinter.Tk() # Code ...
- oracle导表小结
事件描述:从A主机oracle服务器导出.sql文件到B主机,发现1.导入存在乱码 2.提示USERS表空没有权限(A B主机均为window系统) 1.针对第一点乱码 首先确认系统的默认字符编码GB ...
- CURL实现HTTP的GET POST方法
Curl是Linux下一个非常强大的http命令行工具,其功能十分强大. 一.CURL对HTTP的常规訪问 1. 訪问站点 $ curl http://www.linuxidc.com 回车之后.ww ...
- Python ljust() 方法
描述 ljust() 方法返回一个原字符串左对齐,并使用指定字符填充至指定长度的新字符串,默认的填充字符为空格.如果指定的长度小于原字符串的长度则返回原字符串. 语法 ljust() 方法语法: S. ...
- 在python中配置MySQL数据库
MySQL数据库(1) 尽管用文件形式将数据保存到磁盘,已经是一种不错的方式.但是,人们还是发明了更具有格式化特点,并且写入和读取更快速便捷的东西——数据库(如果阅读港台的资料,它们称之为“资料库”) ...
- mysql-5.7中的innodb_buffer_pool_prefetching(read-ahead)详解
一.innodb的read-ahead是什么: 所谓的read-ahead就是innodb根据你现在访问的数据,推测出你接下来可能要访问的数据,并把它们(可能要访问的数据)读入 内存. 二.read- ...
- 为什么easyui的datagrid里getSelections还有getChecked只能获取一行值呢?
http://jquery-easyui.wikidot.com/forum/t-280470 如果没有 idField属性,getSelections就只能获取一个行的值了 注意:如果用了前面说的& ...
- php读取sqlite数据库入门实例
php读取sqlite数据库的例子,php编程中操作sqlite入门实例.原文参考:http://www.jbxue.com/article/php/22383.html在使用SQLite前,要确保p ...
- 如何进行SVN数据迁移并保存版本号数据
如何从一台服务器192.168.8.2迁移到另一台服务器192.168.8.30进行SVN数据迁移并保存版本号数据 工具/原料 SVN 方法/步骤 1 打开远程服务,连接192.168.8.2 ...
- Oracle PLSQL Demo - 27.Declare & Run Sample
declare v_sal ) :; begin --if you could not see the output in console, you should set output on firs ...