背景知识:

子进程先于父进程结束时,会给父进程发送SIGCHLD信号

如果
                                                                    1、父进程没有忽略SGICHLD信号;
                                                                     或者
                                                                     2、父进程没有调用wait或waitpid函数。
                                                          那么子进程将僵死。

(

在2.6内核,只要父进程显式忽略了SIGCHLD信号,

那么子进程将不会僵死,那么system将得不到子进程的退出状态。

也就是说system函数的返回值并不是子进程退出时的状态。

而2.4内核,只要父进程没有调用wait系列函数,子进程就将僵死。
                                                                                     不论是否忽略了SIGCHLD信号。

)

如果,我们在我们的server中需要调用system来调用外部脚本或程序来执行某写工作。

int   ret   =    system(command);

if( ret == 0)

{

//成功

}

else

{

//失败

}

其中ret用来接收子进程退出是的返回值。即exit的返回值。

但是由于在deamon中忽略了SIGCHLD信号,所以主进程将不再接收子进程的返回值。所以,ret的值不能正确反映子进程的退出状态。

正确的做法是::

sighandler_t old_handler;

old_handler = signal(SIGCHLD,SIG_DFL);                //为了准确地获取 system 函数的返回值,不能显式(SIG_IGN)地忽略 SIGCHLD 信号

system(command);            //system 函数:1.fork一个进程;2.在子进程中调用 exec() 去执行新程序;3.在父进程中调用 waitpid 去等待子进程结束

signal(SIGCHLD,old_handler);        //old_handler 记录了之前对于 SIGCHLD 信号的处理方式,现在还原回去

2、system相关问题::

system函数其实是调用fork,exec,waitpid来实现的。

1、fork一个进程;

2、在子进程中调用exec去执行新程序。

3、在父进程中调用waitpid去等待子进程结束。

如果在父进程已经signal(SIGCHLD,SIG_IGN);那么子进程结束时,子进程的返回值不能被waitpid接收。

这个是必须关注的问题。

原文地址:http://www.360doc.com/content/14/0305/09/13084517_357841525.shtml

system函数和signal(SIGCHLD, SIG_DFL)的“固定搭配”相关推荐

  1. linux下system函数的深入理解

    这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为 ...

  2. system函数深度理解

    转载地址:https://www.cnblogs.com/tdyizhen1314/p/4902560.html 注:从其它地方转的非常好的一篇文章,值得深究! 这几天调程序(嵌入式linux),发现 ...

  3. linux下system函数详解

    一.system函数的简单介绍 头文件 #include <stdlib.h>函数定义int system(const char * string); 函数说明 system()会调用fo ...

  4. system函数的总结

    最近在看APUE第10章中关于system函数的POSIX.1的实现.关于POSIX.1要求system函数忽略SIGINT和SIGQUIT,并且阻塞信号SIGCHLD的论述,理解得不是很透彻,本文就 ...

  5. 什么是signal(SIGCHLD, SIG_IGN)函数

    什么是signal(SIGCHLD, SIG_IGN)函数 在进行网络编程时候遇到这个函数的使用,自己学习结果如下,有不对请帮忙指正:) signal(SIGCHLD, SIG_IGN) 打开manp ...

  6. Linux下使用system()函数一定要谨慎

    转载自:http://my.oschina.net/renhc/blog/53580 linux尽量避免使用system. 曾经的曾经,被system()函数折磨过,之所以这样,是因为对system( ...

  7. linux windows c system 函数简介

    windows 在windows下的system函数中命令可以不区别大小写!  功 能: 发出一个DOS命令 #include <stdlib.h>int system(char *com ...

  8. 使用system函数时应该忽略两个信号

    在8.13节,我们展示了一个system函数的实现.然而,那个版本没有处理信号.POSIX.1要求system忽略 SIGINT和SIGQUIT并阻塞SIGCHLD.在展示正确处理这些信号的版本之前, ...

  9. 【C/C++】Linux下使用system()函数一定要谨慎

    曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.只是简单的知道用这个函数执行一个系统命令,这远远不够,它的返回值.它所执行命令的返回值以及命令执行失败原 ...

最新文章

  1. 软件熵:软件开发中推倒重来的过程就是软件熵不断增加的过程
  2. Linux中为wget命令设置代理
  3. SpringBoot+MyBatis登录案例
  4. Web SQL Database 之 SQLite语法
  5. Mysql数据库表复制操作语句
  6. EF Core查询标签TagWith
  7. 【李宏毅机器学习】Brief Introduction of Deep Learning 深度学习简介(p12) 学习笔记
  8. dropout为什么有效
  9. 灰度资产管理总规模升至460亿美元
  10. linux 卸载pppoe,列“State”不属于表 。
  11. android 双拼输入法,高效输入解决方案——双拼输入法
  12. toc如何判断 word_在WORD为什么点插入目录显示{TOC\o1
  13. ViewGroup详解
  14. standard-version(发版与 Changelog 自动化)
  15. 【WPS】未安装VBA支持库,无法运行文档中的宏。如需要启用宏功能,请点击这里了解详情。
  16. 第十一届蓝桥杯省赛第一场原题
  17. c语言放空一个数组,数组越界真可怕,莫名就闯到了别人家
  18. 如何批量压缩pdf文件到最小
  19. UTC时间 GMT时间 本地时间 北京时间 时区 夏令时简要说明
  20. 【python】身份证号码有效性校验

热门文章

  1. 凡事预则立不预则废,你有自己的应急基金吗?教你如何理财
  2. 北师大1903计算机在线答案,[南开大学(本部)]20秋学期(1709、1803、1809、1903、1909、2003、2009 )《程序设计基础(下)》在线作业-2...
  3. 全民一起玩Python提高篇第十二课:面向对象基本原理与语法(三)
  4. FreeRTOS学习一(简介)
  5. 不放弃每一个节日,植树节也能玩H5营销
  6. 有哪些适合大学生投稿的普刊(社科类)?
  7. Vmware黑屏解决
  8. 完善circos做图
  9. Head First Statistics one 做图规则
  10. html 的ul是块矿元素吗,食品化学题库单选判断