SIGCLD

简单的说, SIGCLD不是可靠信号. 这里的不可靠是指当大量信号来的时候, 重复信号它只会处理一次, 而不是多次. 很多信号在瞬间("同时")产生,内核也不一定能够一一处理, 不保证产生的次数.


SIGHCLD

  • 如果父进程在fork之后调用wait,就会阻塞,直到有一个子进程退出。如果父进程在fork之前先signal(SIGCLD,Fun),即注册了SIGCLD的信号处理函数。然后做自己的事情。
    当子进程退出时,会给父进程发送一个SIGCLD信号。然后Fun函数就会执行。可以在Fun函数中调用wait获得子进程退出时的状态,并且此时wait不会阻塞。
    当Fun函数执行完后,父进程又继续做自己的事情。

  • SIGCHLD简单的说,子进程退出时父进程会收到一个SIGCHLD信号,默认的处理是忽略这个信号,而常规的做法是在这个信号处理函数中调用wait函数获取子进程的退出状态。

  
  1. /*************************************************************************
  2. > File Name: SIGCHLD_SIGCLD.cpp
  3. > Author: Function_Dou
  4. > Mail:
  5. > Created Time: 2018年02月03日 星期六 17时56分10秒
  6. ************************************************************************/
  7. #include<sys/wait.h>
  8. #include<stdio.h>
  9. #include<stdlib.h>
  10. #include<unistd.h>
  11. #include<sys/wait.h>
  12. static void sig_cld(int);
  13. int main()
  14. {
  15. pid_t pid;
  16. // if(signal(SIGCLD,sig_cld) == SIG_ERR)
  17. if(signal(SIGCHLD,sig_cld) == SIG_ERR)
  18. {
  19. printf("signal error\n");
  20. exit(-1);
  21. }
  22. if((pid = fork()) < 0)
  23. {
  24. printf("fork error\n");
  25. exit(-1);
  26. }
  27. else if(pid == 0)
  28. {
  29. //child
  30. printf("%d fork a new child %d\n",getppid(),getpid());
  31. sleep(1);
  32. exit(0);
  33. }
  34. else
  35. {
  36. //parent
  37. // sig_cld(0);
  38. int i,j;
  39. for(i=0;i<100;i++)
  40. {
  41. for(j=0;j<10000000;j++)
  42. ;
  43. printf("%d\n",i);
  44. }
  45. }
  46. }
  47. static void sig_cld(int)
  48. {
  49. pid_t pid;
  50. int status;
  51. printf("SIGCLD received\n");
  52. // wait() 返回退出状态
  53. if((pid = wait(&status)) <0)
  54. {
  55. printf("wait error\n");
  56. }
  57. printf("pid = %d\n",pid);
  58. }

运行结果

  
  1. [root@localhost Signal]# ./a.out
  2. 13936 fork a new child 13937
  3. 0
  4. 1
  5. 2
  6. ...
  7. 51
  8. 52
  9. SIGCLD received
  10. pid = 13937
  11. 53
  12. 54
  13. ...

从运行就可以看出来, 信号中的函数调用wait()父进程依然在运行, 当子进程结束后, 父进程接着执行.
当去掉signal那段函数, 在else中调用sig_cld()函数, 结果将发生改变, 当子进程结束, 父进程才继续运行.

关于SIGHCLD和SIGCLD相关推荐

  1. 信号 09 | SIGCLD语义

    1. SIGCLD信号 SIG_DFL :默认的处理方式是不理会这个信号,但是也不会丢弃子进程状态,所以如果不用wait,waitpid对其子进行进行状态信息回收,会产生僵尸进程. SIG_IGN : ...

  2. 说说SIGCLD和SIGCHLD

    在学习 APUE 信号一章时,书中描述 SIGCLD和 SIGCHLD信号时,我一时没有搞清楚,在查阅一些资料后把二者的不同描述在此. APUE这本书有一个很大的特点是:它全书写的是Unix平台的编程 ...

  3. c语言信号机制以及中断

    用户态到内核态切换途径: 1:系统调用        2:中断 3:异常 中断类型分为如下两大类: 一.强迫性中断:正在运行的程序所不期望的,来自硬件故障或外部请求. 1.I/O 中断:来自外部设备通 ...

  4. Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

    Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...

  5. Linux进程编程基础介绍

    Linux系统是一个多进程的系统,它的进程之间具有并行性.互不干扰等特点.也就是说,每个进程都是一个独立的运行单位,拥有各自的权利和责任.其中,各个进程都运行在独立的虚拟地址空间,因此,即使一个进程发 ...

  6. celery源码分析:multi命令分析

    celery源码分析 本文环境python3.5.2,celery4.0.2,django1.10.x系列 celery简介 celery是一款异步任务框架,基于AMQP协议的任务调度框架.使用的场景 ...

  7. linux下多进程编程简介

    两年前的文章,拿过来充充门面. ------------------------ linux下多进程编程简介 ( 作者:mikespook | 发布日期:2002-12-8 | 浏览次数:272 ) ...

  8. Linux 进程间通信

    引言 进程通信的目的: 数据传输 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据 多个进程想要操作共享数据,一个进程对共享数据 通知事 一个进程需要向另一个或一 ...

  9. linux版的lcx

    未编译的 #include <sys/time.h> #include <signal.h> #include <stdlib.h> #include <sy ...

最新文章

  1. 年度回顾:2018年的人工智能/机器学习惊喜及预测19年的走势
  2. PHP之GD函数的使用
  3. 数据库:MySQL、SqlServer、Oracle对比
  4. 一些实用却很少用到的css以及标签
  5. 最严谨的校验email地址的正则表达式
  6. java ios rsa解密乱码_java与IOS之间的RSA加解密
  7. 《Python游戏趣味编程》 第3章 美丽的圆圈画
  8. Wechall Challenges Writeup 知识拓展
  9. ubuntu 挂载U盘 NTFS
  10. 物联卡无信号无服务器,物联卡没信号无服务怎么办
  11. Unity3D数字孪生开发笔记——网络篇
  12. 静态库,动态库是啥,有啥区别(静态函数库/动态函数库)
  13. 如何在 Windows 右键菜单中新建自己想要的文件格式
  14. 【行业应用】浅谈AI如何在电力行业落地
  15. mac上的PCB设计软件现状
  16. 并发编程(五)——生产者消费者模式
  17. 疫情期间再读三体(4)——杨冬之死与“终极问题”的思考
  18. SSD固态硬盘的闪存芯片颗粒介绍
  19. C++:布尔类型(bool)详细分析
  20. 华为服务器安装乌班图系统,安装乌班图服务器版本

热门文章

  1. 我平常用计算机玩游戏英语,桌面游戏用英语怎么说
  2. 文件删除终结者 v1.2 免费
  3. PCF8563实时时钟模块功能实现
  4. 浙江咪咕MGV3200_KLH_国科GK6323_2+8_免拆机卡刷固件包
  5. 限速linux c语言,基于Linux系统的流量控制程序的C语言代码
  6. 酷派android最新版本,酷云手机版下载
  7. java自动填充_java 如何自动填充网页上的用户名和密码?
  8. 解决password自动填充问题
  9. 多种方式实现字幕滚动效果
  10. 66W真的比60W充电更快吗?基于Charge pump Charger的快充方案分析