#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);的使用及验证的更多相关文章

  1. signal(SIGCHLD, SIG_IGN)和signal(SIGPIPE, SIG_IGN);

    signal(SIGCHLD, SIG_IGN); //忽略SIGCHLD信号,这常用于并发服务器的性能的一个技巧 //因为并发服务器常常fork很多子进程,子进程终结之后需要//服务器进程去wait ...

  2. 【转载】signal(SIGCHLD, SIG_IGN)和signal(SIGPIPE, SIG_IGN)

    来源:https://blog.csdn.net/guotao1983/article/details/82118218 signal(SIGCHLD, SIG_IGN) 因为并发服务器常常fork很 ...

  3. signal(SIGPIPE, SIG_IGN)

    文章来源:http://blog.163.com/niuxiangshan@126/blog/static/170596595201221942952676/   当服务器close一个连接时,若cl ...

  4. signal(SIGPIPE, SIG_IGN) (转)

    signal(SIGPIPE, SIG_IGN) 当服务器close一个连接时,若client端接着发数据. 根据TCP 协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会 ...

  5. signal(SIGPIPE, SIG_IGN)(转)

    signal(SIGPIPE, SIG_IGN) 当服务器close一个连接时,若client端接着发数据.根据TCP 协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发 ...

  6. (win 7)使用puma以后,重启rails server报错: in `trap': unsupported signal SIGCHLD (ArgumentError)

    如图: 解决方案: 把config/puma.rb 文件中的 workers Integer(ENV['WEB_CONCURRENCY'] || 2) 改成 workers Integer(ENV[' ...

  7. Linux 信号详解一(signal函数)

    信号列表 SIGABRT 进程停止运行 SIGALRM 警告钟 SIGFPE 算述运算例外 SIGHUP 系统挂断 SIGILL 非法指令 SIGINT 终端中断 SIGKILL 停止进程(此信号不能 ...

  8. linux下的僵尸进程处理SIGCHLD信号

    什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该 ...

  9. [转] linux下的僵尸进程处理SIGCHLD信号

    什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些 信息至少包括进程ID,进程的终止状态,以及 ...

随机推荐

  1. 转载:substr() mb_substr() mb_subcut区别与联系

    substr() $rest = substr("abcdef", 1); //bcdef $rest = substr("abcdef", 1,5); //b ...

  2. MySQL-关于事务的使用

    如果你一次执行单条查询语句, 则没有必要启用事务支持, 数据库默认支持SQL执行期间的读一致性, 如果你一次执行多条查询语句, 例如统计查询, 报表查询, 在这种场景下, 多条查询SQL必须保证整体的 ...

  3. Android用shareUserID实现多个Activity显示在同一界面

    近来整理文档,发现两年前研究Android多个Activity叠加显示的方案.时光荏苒,一去不回. 虽然后来没有用上,但还是整理如下,Android版本还是2.2的: ActivityGroup描画方 ...

  4. 存储映射I/O

    一个进程拥有独立并且连续虚拟地址空间,在32位体系结构中进程的地址空间是4G.不过,内核在管理进程的地址空间时是以内存区域为单位.内存区域是进程整个地址空间中一个独立的内存范围,它在内核中使用vm_a ...

  5. Maven install 报错: Failed to execute goalorg.apache.maven.plugins:maven-gpg-plugin:1.4:sign (sign-art

    执行 Maven install 时报错: Failed to execute goalorg.apache.maven.plugins:maven-gpg-plugin:1.4:sign (sign ...

  6. sublim3常用插件安装

    1首先需要安装插件管理器Package Control,点击View > Show Console菜单,输入以下代码,按回车运行即可.说明:以下只对st3有效 import urllib.req ...

  7. 利用ichart绘制网页图表

    首先,最好的教程在这里:ichartjs 有了这个网站,要绘制网页图表简直方便愉快! 接下来说一下使用方法~~~ 进入网站,点击在线设计器 在线设计器的使用方法就不说了,摸索一下就会了!关键在于两个地 ...

  8. mysqlbackup 重建带有gtid特性的slave

    一.mysqlbackup简介: mysqlbackup是mysql的一个企业级备份工具,优点就是牛逼,缺点就是这东西要钱买. 二.gtid 特性简介: gtid 的中文名叫全局事务ID,也就是说每一 ...

  9. Install Ambari 2.2.0 from Public Repositories(Hadoop)

    Step1: Download the Ambari repository on the Ambari Server host For Redhat/CentOS/Oracle:   cd /etc/ ...

  10. linux分享一:进程全攻略--守护进程(服务)

    概括: 进程是程序的运行实例.进程对应一个唯一的进程PID, 统一程序的多个实例可以同时运行,他们的pid互不相同. 进程一般分为交互进程.批处理进程和守护进程(daemons)三类 一:什么是守护进 ...