- 浏览: 146098 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 865#include<stdio.h> #includ ... -
简单的linux -c http-client
2013-10-23 15:35 4662#include<stdio.h> #includ ... -
毗连“"aa"”和“"bb"”不能给出一个有效的预处理标识符,gcc编译错误表
2013-10-01 18:54 2858gcc bug : ##’ cannot appear at ... -
负数转化为整数
2013-10-01 12:02 1288负数转化为整数 int a = -1321313; 12 ... -
STDIN_FILENO的作用及与stdin 的区别
2013-09-08 14:48 858if(NULL == fgets(msg,100,stdi ... -
linux进程cpu资源分配命令nice,renice,taskset
2013-09-04 14:03 1126nice,renice 指定进程运行的优先级 taskset ... -
c++ 动态内存分配
2013-08-28 22:35 780先看一段代码: [cpp] view plaincopy ... -
文件结束符EOF,system("stty raw")
2013-08-14 10:47 1503>> 关于文件结束符EOF EOF 是 End O ... -
c 专家编程
2013-08-13 17:06 652总结: -2> int * a = NUL ... -
Linux中线程与CPU核的绑定
2013-08-09 15:15 2083最近在对项目进行性能 ... -
建议编译的时候加警告 atof
2013-08-07 20:46 668#include <stdlib.h> ... -
feodra 17 安装 chrome
2013-08-04 01:35 7221: 下载:http://www.google.cn/chro ... -
Sudo提权出现:xx用户不在 sudoers 文件中
2013-08-03 20:22 870Sudo提权出现:xx用户不在 sudoers 文件中 症状 ... -
c语言api
2013-07-31 21:06 637原型:extern int isalnum(int c); 用 ... -
c 语言无符号类型使用注意,类型升级
2013-07-30 14:37 588#define SS sizeof(int) 5 int ... -
select,epoll,poll比较
2013-07-28 17:13 649select,poll,epoll简介 se ... -
gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数
2013-07-22 22:45 848我们用gcc编译程序时,可能会用到“-I”(大写i),“-L” ... -
Linux下如何将进程绑定在特定的CPU上运行
2013-07-22 10:52 947Linux下如何将进程绑定在特定的CPU上运行? 以root用 ... -
linux运维常用命令
2013-07-13 20:40 808推荐一个实用命令:awk '{x+=$2} END {prin ... -
linux 进程通信方式
2013-07-07 20:46 588# 管道( pipe ):管道是一种半双工的通信方式,数据只能 ...
相关推荐
嵌入式-信号机制(概念,发送,定时,捕捉,SIGCHLD 信号实现回收子进程)
在Linux系统下,如果使用sigaction将信号SIGCHLD的sa_flags中的SA_NOCLDSTOP选项打开,当子进程停止(STOP作业控制)时, 不产生此信号(即SIGCHLD)。不过,当子进程终止时,仍旧产生此信号(即SIGCHLD)。 3....
僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14...
LINUX SOCKET编程通信小例子,入门级。试过可以运行。
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 ...
僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14...
僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14...
僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14...
4.7. 关于SIGCHLD信号 34. 终端、作业控制与守护进程 1. 终端 1.1. 终端的基本概念 1.2. 终端登录过程 1.3. 网络登录过程 2. 作业控制 2.1. Session与进程组 2.2. 与作业控制有关的信号 3. 守护进程 35. 线程 1. ...
getsockname、getpeername gethostname、gethostbyname、gethostbyaddr 11socket编程(六) TCP回射客户/服务器 TCP是个流协议 僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四...
僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14...
僵进程与SIGCHLD信号 12socket编程(七) TCP 11种状态 连接建立三次握手、连接终止四次握手 TIME_WAIT与SO_REUSEADDR SIGPIPE 13socket编程(八) 五种I/O模型 select 用select改进回射客户端程序 14socket编程(九...
其中,信号处理模块主要负责对于子进程返回产生的SIGCHLD信号以及按下ctrl-Z之后产生的SIGTSTP信号进行处理,捕获SIGCHLD信号是为了更新后台进程表,而捕获SIGTSTP信号是为了将当前的进程挂起。 打印命令提示...
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中,当一个进程退出(exit())时,会向它的父进程发送一个SIGCHLD信号。父进程收到该信号后,会释放分配给该子进程的系统资源;并且父进程需要调用wait()或waitpid()等待子进程结束。如果父进程没有做这种...
C/C++头文件一览,这个文件是从这个站点下载的!不过那里要1分!最痛恨要资源分的人了!所以下载下来在上传上来,给各位免费下载!
4.7. 关于SIGCHLD信号 34. 终端、作业控制与守护进程 1. 终端 1.1. 终端的基本概念 1.2. 终端登录过程 1.3. 网络登录过程 2. 作业控制 2.1. Session与进程组 2.2. 与作业控制有关的信号 3. 守护进程 35. 线程 1. ...
)要获得僵尸进程,可以使用命令将SIGCHLD信号手动发送到父进程。 如果父进程拒绝收割僵尸,则可以选择终止父进程(通常使用SIGTERM信号)。 当子进程失去其父进程时, init进程将成为其新的父进程,并且由于它将...
当一个进程正常或异常终止的时候,内核就像其父进程发送SIGCHLD信号,因为子进程是个一步事件,所以这种信号也是内核系那个父进程发的异步通知。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的...
signal(SIGCHLD, SIG_IGN); len200 = strlen(head200); len404 = strlen(head404); len503 = strlen(head503); daemon_init(); //转为后台程序,如需打印调试,把这行注释掉 if (write_pid() ) //避免同时...