`

关于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)
》》
分享到:
评论

相关推荐

    Linux 信号signal处理机制

    Linux 信号机制是操作系统提供的一种进程间通信方式,它用于通知进程发生了特定的异步事件。信号机制在Linux编程中扮演着重要角色,因为它允许进程响应来自其他进程、内核或者用户的事件。以下是对信号机制的详细...

    linux信号的机制

    ### Linux信号机制详解 #### 一、信号的基本概念 在Linux操作系统中,信号(Signal)是一种重要的进程间通信(IPC, Inter-Process Communication)机制,主要用于通知进程发生了某些类型的异常事件或状态变化。...

    Linux 信号signal处理机制.docx

    "Linux 信号signal处理机制" 本文详细介绍了Linux信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。信号机制是进程之间相互传递消息的一种方法,信号全称为软中断...

    Linux信号机制

    Linux信号机制是操作系统内核中用于进程间通信和异常处理的一种机制。它允许一个进程向另一个进程发送消息,这些消息可以是关于特定事件的通知,或者是请求执行特定操作的命令。在Linux系统中,信号机制是基于POSIX...

    Linux信号(signal)机制.rar

    在Linux操作系统中,信号(Signal)是一种异步通信机制,用于通知进程发生了某些事件或条件。它是进程间通信(IPC, Inter-Process Communication)的一种基本方式,尤其在处理错误、异常或者时间间隔等事件时非常...

    linux信号机制和signal

    ### Linux信号机制与Signal详解 #### 一、信号机制的基本概念 信号是Linux操作系统中用于进程间通信的重要机制之一,其本质上是一种软中断信号。它主要用于通知进程发生了异步事件,而不涉及具体的数据传递。在...

    Linux信号机制的分析与研究.pdf

    Linux信号机制是操作系统中进程间通信的重要方式,尤其在Linux环境下,它被广泛应用于进程管理、异常处理和用户交互。信号是一种轻量级的通知机制,它通知进程发生了特定的异步事件,但并不传递数据。在Linux 2.4...

    unix/linux信号详解大全

    Unix/Linux 操作系统中,信号是一种异步事件处理机制,用于通知进程某个事件的发生。信号可以由硬件异常、软件异常、终止进程、进程挂起、定时器到期等事件触发。本文将对 Unix/Linux 信号进行详细的分类和解释。 ...

    linux中的signal机制

    相比之下,`sigaction`函数提供了更强大和安全的信号处理机制,支持同时捕获多个信号,并能确保信号处理函数在多线程环境中正确地执行。 ### 示例代码:信号处理 下面是一个使用`sigaction`函数处理SIGINT信号的...

    linux信号说明文档

    ### Linux信号说明文档 在Linux系统中,信号是进程间通信的一种方式,它用来通知接收进程发生了一些事件。本文档将详细介绍Linux系统中常见的信号及其用途。 #### SIGHUP(挂断信号) 当一个终端挂断时(例如,...

    Linux下C语言编程--信号处理函数.

    ### Linux下C语言编程——信号处理函数 #### 一、信号的基本概念与产生 在Linux系统中,**信号**是一种轻量级的进程间通信机制,用于通知接收进程某个特定事件的发生。它不仅可以由硬件异常(如除零错误)触发,也...

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

    ### 嵌入式系统中的信号机制详解 ...以上就是关于嵌入式系统中信号机制的概念、产生、处理方式、常用信号、信号发送以及定时器函数等内容的详细介绍。希望这些内容能帮助您更好地理解和使用信号机制。

    Linux_信号说明列表

    在Linux系统中,信号是一种重要的通信机制,用于通知进程发生了一些事件或错误。本篇文章将详细解释由`$ kill -l`命令输出的信号列表,包括每个信号的意义及其应用场景。 #### 二、信号列表详解 1. **SIGHUP (1)**...

    linux环境高级编程4-信号.ppt

    在Linux环境中,高级编程涉及到许多核心概念,其中信号(Signal)是进程间通信和异常处理的重要机制。信号是操作系统向进程发送的一种异步通知,通常用于处理非正常情况或者进程间的交互。本讲主要介绍了信号的概念...

    学习《高级Linux环境编程》读书笔记(APUE读书笔记)

    10. 信号:这是UNIX系统中用于进程间通信的一种机制,包括信号的基本概念、常用信号、信号处理函数signal、不可靠信号机制、自动重启动问题、可重入函数、信号集操作以及特定信号如SIGCHLD的处理等。 11. 线程:本...

    linux信号专题笔记.docx

    Linux信号是一种软件中断机制,它允许系统对特定事件做出反应。这些事件可以是程序错误、外部请求或者是系统级别的改变。当发生这样的事件时,系统会向进程发送一个信号。信号是用于通知进程发生了某种事件的一种...

    Linux编程接口 - Linux和UNIX系统编程手册

    通过阅读本书的这一章,开发者将能够熟练掌握如何在Linux和UNIX系统中有效地利用信号机制进行系统级编程,提升程序的稳定性和可靠性。同时,书中还会强调标准和可移植性问题,确保编写出的代码不仅适用于Linux,也能...

    Linux下的信号详解及捕捉信号

    在Linux操作系统中,信号是一种异步通信机制,用于通知进程发生了特定的事件或条件。信号的基本概念包括每个信号的编号和宏定义,这些定义可以在`&lt;signal.h&gt;`头文件中找到。通过`kill -l`命令,用户可以查看系统支持...

Global site tag (gtag.js) - Google Analytics