`

关于linux环境下信号SIGCHLD的排队机制

阅读更多
下面是关于在SIGCHLD的一遍网上的摘要,但是在linux中是不许要这样做的。
signal(SIGCHLD,SIG_IGN); 就可以了,我已经子啊ubuntu12.04上面做过了测试!
  1 #include <sys/types.h>
  2 #include <unistd.h>
  3 #include<stdio.h>
  4 #include<stdlib.h>
  5 #include<signal.h>
  6 int main()
  7 {
  8         signal(SIGCHLD,SIG_IGN);
  9         pid_t  tid= fork();
10         if(tid == 0){
11
12
13           printf("child process %d\n",getpid());
14           exit(0);
15
16          }else if(tid >0){
17
18
19           printf("parent process %d\n",getpid());
20           while(1==1)
21                 {
22
23
24                 }
25            }
26
27 }


result:
不使用signal(SIGCHLD,SIG_IGN);
aircoder@aircoder-ThinkPad-T430:~/c/test$ ps aux | grep aaa | grep -v grep
aircoder  3469 98.2  0.0   4152   348 pts/0    R+   23:20   0:10 ./aaa
aircoder  3470  0.0  0.0      0     0 pts/0    Z+   23:20   0:00 [aaa] <defunct>
使用signal(SIGCHLD,SIG_IGN);
aircoder@aircoder-ThinkPad-T430:~/c/test$ ps aux | grep bbb | grep -v grep
aircoder  3482 87.3  0.0   4152   352 pts/0    R+   23:20   0:05 ./bbb
aircoder@aircoder-ThinkPad-T430:~/c/test$


《《网络摘要
一直对这个问题没有深入的思考过。最近由于项目的需要终于弄清了这个问题。
以下文字是抄袭+理解+估计:
在linux系统中,子进程的正常/异常终止都会给父进程发送SIGCHLD的信号,当父进程接收到子进程(第一个)信号进行wait()或waitpid()时,会屏蔽掉下一个的SIGCHLD信号,实际的效果就是在信号处理函数返回前不会重入。
那么当父进程在执行信号处理函数时,又有子进程(第二个)退出,那么信号会被阻塞并等待处理,假如(第三个)又来了,那么它是被抛弃的,后续的都会抛弃。。。
所以说信号是阻塞但不排队的。
如果子进程可能会同时退出,那么父进程需要这样来处理以防止僵尸进程的出现:
pid_t childpid;
while( (childpid = waitpid(-1, NULL, WNOHANG)) > 0)
{
...
}
这样,即使出现子进程同时退出的情况,SIGCHLD的信号被抛弃也没有关系。waitpid会收集所有当前已终止(实际就是处于僵尸状态)的子进程,直到没有这样的进程状态需要收集(返回0)
》》
分享到:
评论

相关推荐

    嵌入式-信号机制(概念,发送,定时,捕捉,SIGCHLD 信号实现回收子进程)

    嵌入式-信号机制(概念,发送,定时,捕捉,SIGCHLD 信号实现回收子进程)

    NDK20_线程轮询实现双进程守护

    在Linux系统下,如果使用sigaction将信号SIGCHLD的sa_flags中的SA_NOCLDSTOP选项打开,当子进程停止(STOP作业控制)时, 不产生此信号(即SIGCHLD)。不过,当子进程终止时,仍旧产生此信号(即SIGCHLD)。 3....

    Linux网络编程 视频 教程

    僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14...

    linux net socket 编程示例

    LINUX SOCKET编程通信小例子,入门级。试过可以运行。

    linux信号量说明

    1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD18) SIGCONT ...

    C++教程网《Linux网络编程》视频百度云地址

    僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14...

    c++教程网的linux网络编程视频下载

    僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14...

    [免费]2018年C++教程网的linux网络编程视频百度云下载链接.rar

    僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14...

    Linux C 一站式学习

    4.7. 关于SIGCHLD信号 34. 终端、作业控制与守护进程 1. 终端 1.1. 终端的基本概念 1.2. 终端登录过程 1.3. 网络登录过程 2. 作业控制 2.1. Session与进程组 2.2. 与作业控制有关的信号 3. 守护进程 35. 线程 1. ...

    linux网络编程

    getsockname、getpeername gethostname、gethostbyname、gethostbyaddr 11socket编程(六) TCP回射客户/服务器 TCP是个流协议 僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四...

    C++教程网视频:linux网络编程

    僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14...

    2018年C++教程网的linux网络编程视频共41集百度云下载链接.rar

    僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14socket编程(九...

    C语言实现一个shell 程序的基本功能,优秀Linux 程序设计!

    ​ 其中,信号处理模块主要负责对于子进程返回产生的SIGCHLD信号以及按下ctrl-Z之后产生的SIGTSTP信号进行处理,捕获SIGCHLD信号是为了更新后台进程表,而捕获SIGTSTP信号是为了将当前的进程挂起。 ​ 打印命令提示...

    Linux函数和脚本

    16.17 SIGCHLD 17.18 SIGCONT 18.19 SIGSTOP 19.20 SIGTSTP 20.21 SIGTTIN 21.22 SIGTTOU 22.23 SIGURG 23.24 SIGXCPU 24.25 SIGXFSZ 25.26 SIGVTALRM 26.27 SIGPROF 27.28 SIGWINCH 28.29 SIGIO 29.30 SIGPWR 30.31...

    Android Init进程对信号的处理流程详细介绍

    在Android中,当一个进程退出(exit())时,会向它的父进程发送一个SIGCHLD信号。父进程收到该信号后,会释放分配给该子进程的系统资源;并且父进程需要调用wait()或waitpid()等待子进程结束。如果父进程没有做这种...

    C/C++头文件一览

    C/C++头文件一览,这个文件是从这个站点下载的!不过那里要1分!最痛恨要资源分的人了!所以下载下来在上传上来,给各位免费下载!

    宋劲彬的嵌入式C语言一站式编程

    4.7. 关于SIGCHLD信号 34. 终端、作业控制与守护进程 1. 终端 1.1. 终端的基本概念 1.2. 终端登录过程 1.3. 网络登录过程 2. 作业控制 2.1. Session与进程组 2.2. 与作业控制有关的信号 3. 守护进程 35. 线程 1. ...

    zps:一个用于在GNULinux上列出和获取僵尸进程的小实用程序

    )要获得僵尸进程,可以使用命令将SIGCHLD信号手动发送到父进程。 如果父进程拒绝收割僵尸,则可以选择终止父进程(通常使用SIGTERM信号)。 当子进程失去其父进程时, init进程将成为其新的父进程,并且由于它将...

    深入浅出---unix多进程编程之wait()和waitpid()函数

    当一个进程正常或异常终止的时候,内核就像其父进程发送SIGCHLD信号,因为子进程是个一步事件,所以这种信号也是内核系那个父进程发的异步通知。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的...

    一个进程池的服务器程序

    signal(SIGCHLD, SIG_IGN); len200 = strlen(head200); len404 = strlen(head404); len503 = strlen(head503); daemon_init(); //转为后台程序,如需打印调试,把这行注释掉 if (write_pid() ) //避免同时...

Global site tag (gtag.js) - Google Analytics