SIGCHLD的产生条件

子进程终止时

子进程接收到SIGSTOP信号停止时

子进程处在停止态,接受到SIGCONT后唤醒时

借助SIGCHLD信号回收子进程

子进程结束运行,其父进程会收到SIGCHLD信号。该信号的默认处理动作是忽略。可以捕捉该信号,在捕捉函数中完成子进程状态的回收。

/***
sigchild.c
***/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h> void sys_err(char *str)
{
perror(str);
exit();
}
void do_sig_child(int signo)
{
int status; pid_t pid;
while ((pid = waitpid(, &status, WNOHANG)) > ) {
if (WIFEXITED(status))
printf("child %d exit %d\n", pid, WEXITSTATUS(status));
else if (WIFSIGNALED(status))
printf("child %d cancel signal %d\n", pid, WTERMSIG(status));
}
}
int main(void)
{
pid_t pid; int i;
for (i = ; i < ; i++) {
if ((pid = fork()) == )
break;
else if (pid < )
sys_err("fork");
}
if (pid == ) {
int n = ;
while (n--) {
printf("child ID %d\n", getpid());
sleep();
}
return i+;
} else if (pid > ) {
struct sigaction act;
act.sa_handler = do_sig_child;
sigemptyset(&act.sa_mask);
act.sa_flags = ;
sigaction(SIGCHLD, &act, NULL); while () {
printf("Parent ID %d\n", getpid());
sleep();
}
}
return ;
}
/***
my_sigchild.c
***/
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<signal.h> void sys_err(char *str)
{
perror(str);
exit();
} void do_sig_child(int signo)
{
int status;
pid_t pid; while( (pid = waitpid(,&status,WNOHANG)) > )
{
if(WIFEXITED(status))
printf("----------child %d exit %d\n",pid,WEXITSTATUS(status));
else if(WIFSIGNALED(status))
{
printf("child %d cancel signal %d\n",pid,WTERMSIG(status));
}
}
} int main()
{
pid_t pid;
int i; for(i = ; i < ; i++)
{
if((pid = fork()) == )
{
break;
}
else if(pid < )
{
sys_err("fork");
}
} if( == pid)
{
int n = ;
while(n--)
{
printf("child ID %d\n",getpid());
sleep();
}
return i+;
}
else if(pid > )
{
struct sigaction act;
act.sa_handler = do_sig_child;
sigemptyset(&act.sa_mask); while()
{
printf("Parent ID %d\n",getpid());
sleep();
} }
return ;
}

分析该例子。结合 17)SIGCHLD 信号默认动作,掌握父使用捕捉函数回收子进程的方式。              【sigchild.c】

如果每创建一个子进程后不使用sleep可以吗?可不可以将程序中,捕捉函数内部的while替换为if?为什么?

if ((pid = waitpid(0, &status, WNOHANG)) > 0) { ... }

思考:信号不支持排队,当正在执行SIGCHLD捕捉函数时,再过来一个或多个SIGCHLD信号怎么办?

最新文章

  1. Android 透明度百分比对应的 十六进制
  2. Nginx反向代理tomcat,seesion会话保持。
  3. SQL*Loader之CASE1
  4. 第三方控件radupload 使用方式以及报错处理
  5. 【现代程序设计】homework-09
  6. Linux 计划任务 Crontab 笔记与总结(2)Crontab 的基本组成与配置
  7. WCF入门, 到创建一个简单的WCF应用程序
  8. Verilog code
  9. Ubuntu安装tomcat
  10. CreateDialog和DialogBox
  11. Android手机用wifi连接adb调试的方法
  12. 使用 intro.js 库
  13. profile和bashrc四种的区别
  14. Shelld5的使用
  15. 第 15 章 位操作(invert4)
  16. sql select 0 字段
  17. [Linux] Big-endian and Little-endian (大小端模式)
  18. OpenStack系列
  19. [HDU3756]Dome of Circus
  20. python错误处理/调试/单元测试/文档测试

热门文章

  1. Kubernetes 学习笔记(五):数据卷
  2. MySQL 触发器的使用
  3. hdu 1875 最小生成树 prime版
  4. java多线程:继承Thread和实现Runable接口的区别
  5. (二十七)JSP标签之核心标签
  6. (五)springmvc之获取表单提交的数据
  7. C# 中类的成员有哪些?
  8. iOS中的分类(category)和类扩展(extension)
  9. 关于Objective C的私有函数
  10. Mybatis设计模式