- 浏览: 154005 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lyaqys:
lz实现的OptimisticExclusiveLock有点问 ...
java park/unpark 【java并发】基于JUC CAS原理,自己实现简单独占锁
下面是关于在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)
》》
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)
》》
发表评论
-
c语言链表实现学生管理
2013-10-28 14:13 902#include<stdio.h> #includ ... -
简单的linux -c http-client
2013-10-23 15:35 4731#include<stdio.h> #includ ... -
毗连“"aa"”和“"bb"”不能给出一个有效的预处理标识符,gcc编译错误表
2013-10-01 18:54 3002gcc bug : ##’ cannot appear at ... -
负数转化为整数
2013-10-01 12:02 1359负数转化为整数 int a = -1321313; 12 ... -
STDIN_FILENO的作用及与stdin 的区别
2013-09-08 14:48 906if(NULL == fgets(msg,100,stdi ... -
linux进程cpu资源分配命令nice,renice,taskset
2013-09-04 14:03 1165nice,renice 指定进程运行的优先级 taskset ... -
c++ 动态内存分配
2013-08-28 22:35 846先看一段代码: [cpp] view plaincopy ... -
文件结束符EOF,system("stty raw")
2013-08-14 10:47 1562>> 关于文件结束符EOF EOF 是 End O ... -
c 专家编程
2013-08-13 17:06 691总结: -2> int * a = NUL ... -
Linux中线程与CPU核的绑定
2013-08-09 15:15 2129最近在对项目进行性能 ... -
建议编译的时候加警告 atof
2013-08-07 20:46 712#include <stdlib.h> ... -
feodra 17 安装 chrome
2013-08-04 01:35 7691: 下载:http://www.google.cn/chro ... -
Sudo提权出现:xx用户不在 sudoers 文件中
2013-08-03 20:22 913Sudo提权出现:xx用户不在 sudoers 文件中 症状 ... -
c语言api
2013-07-31 21:06 678原型:extern int isalnum(int c); 用 ... -
c 语言无符号类型使用注意,类型升级
2013-07-30 14:37 629#define SS sizeof(int) 5 int ... -
select,epoll,poll比较
2013-07-28 17:13 687select,poll,epoll简介 se ... -
gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数
2013-07-22 22:45 910我们用gcc编译程序时,可能会用到“-I”(大写i),“-L” ... -
Linux下如何将进程绑定在特定的CPU上运行
2013-07-22 10:52 990Linux下如何将进程绑定在特定的CPU上运行? 以root用 ... -
linux运维常用命令
2013-07-13 20:40 890推荐一个实用命令:awk '{x+=$2} END {prin ... -
linux 进程通信方式
2013-07-07 20:46 622# 管道( pipe ):管道是一种半双工的通信方式,数据只能 ...
相关推荐
Linux 信号机制是操作系统提供的一种进程间通信方式,它用于通知进程发生了特定的异步事件。信号机制在Linux编程中扮演着重要角色,因为它允许进程响应来自其他进程、内核或者用户的事件。以下是对信号机制的详细...
### Linux信号机制详解 #### 一、信号的基本概念 在Linux操作系统中,信号(Signal)是一种重要的进程间通信(IPC, Inter-Process Communication)机制,主要用于通知进程发生了某些类型的异常事件或状态变化。...
"Linux 信号signal处理机制" 本文详细介绍了Linux信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。信号机制是进程之间相互传递消息的一种方法,信号全称为软中断...
Linux信号机制是操作系统内核中用于进程间通信和异常处理的一种机制。它允许一个进程向另一个进程发送消息,这些消息可以是关于特定事件的通知,或者是请求执行特定操作的命令。在Linux系统中,信号机制是基于POSIX...
在Linux操作系统中,信号(Signal)是一种异步通信机制,用于通知进程发生了某些事件或条件。它是进程间通信(IPC, Inter-Process Communication)的一种基本方式,尤其在处理错误、异常或者时间间隔等事件时非常...
### Linux信号机制与Signal详解 #### 一、信号机制的基本概念 信号是Linux操作系统中用于进程间通信的重要机制之一,其本质上是一种软中断信号。它主要用于通知进程发生了异步事件,而不涉及具体的数据传递。在...
Linux信号机制是操作系统中进程间通信的重要方式,尤其在Linux环境下,它被广泛应用于进程管理、异常处理和用户交互。信号是一种轻量级的通知机制,它通知进程发生了特定的异步事件,但并不传递数据。在Linux 2.4...
Unix/Linux 操作系统中,信号是一种异步事件处理机制,用于通知进程某个事件的发生。信号可以由硬件异常、软件异常、终止进程、进程挂起、定时器到期等事件触发。本文将对 Unix/Linux 信号进行详细的分类和解释。 ...
相比之下,`sigaction`函数提供了更强大和安全的信号处理机制,支持同时捕获多个信号,并能确保信号处理函数在多线程环境中正确地执行。 ### 示例代码:信号处理 下面是一个使用`sigaction`函数处理SIGINT信号的...
### Linux信号说明文档 在Linux系统中,信号是进程间通信的一种方式,它用来通知接收进程发生了一些事件。本文档将详细介绍Linux系统中常见的信号及其用途。 #### SIGHUP(挂断信号) 当一个终端挂断时(例如,...
### Linux下C语言编程——信号处理函数 #### 一、信号的基本概念与产生 在Linux系统中,**信号**是一种轻量级的进程间通信机制,用于通知接收进程某个特定事件的发生。它不仅可以由硬件异常(如除零错误)触发,也...
### 嵌入式系统中的信号机制详解 ...以上就是关于嵌入式系统中信号机制的概念、产生、处理方式、常用信号、信号发送以及定时器函数等内容的详细介绍。希望这些内容能帮助您更好地理解和使用信号机制。
在Linux系统中,信号是一种重要的通信机制,用于通知进程发生了一些事件或错误。本篇文章将详细解释由`$ kill -l`命令输出的信号列表,包括每个信号的意义及其应用场景。 #### 二、信号列表详解 1. **SIGHUP (1)**...
在Linux环境中,高级编程涉及到许多核心概念,其中信号(Signal)是进程间通信和异常处理的重要机制。信号是操作系统向进程发送的一种异步通知,通常用于处理非正常情况或者进程间的交互。本讲主要介绍了信号的概念...
10. 信号:这是UNIX系统中用于进程间通信的一种机制,包括信号的基本概念、常用信号、信号处理函数signal、不可靠信号机制、自动重启动问题、可重入函数、信号集操作以及特定信号如SIGCHLD的处理等。 11. 线程:本...
Linux信号是一种软件中断机制,它允许系统对特定事件做出反应。这些事件可以是程序错误、外部请求或者是系统级别的改变。当发生这样的事件时,系统会向进程发送一个信号。信号是用于通知进程发生了某种事件的一种...
通过阅读本书的这一章,开发者将能够熟练掌握如何在Linux和UNIX系统中有效地利用信号机制进行系统级编程,提升程序的稳定性和可靠性。同时,书中还会强调标准和可移植性问题,确保编写出的代码不仅适用于Linux,也能...
在Linux操作系统中,信号是一种异步通信机制,用于通知进程发生了特定的事件或条件。信号的基本概念包括每个信号的编号和宏定义,这些定义可以在`<signal.h>`头文件中找到。通过`kill -l`命令,用户可以查看系统支持...