system函数和signal(SIGCHLD, SIG_DFL)的“固定搭配”
背景知识:
子进程先于父进程结束时,会给父进程发送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)的“固定搭配”相关推荐
- linux下system函数的深入理解
这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为 ...
- system函数深度理解
转载地址:https://www.cnblogs.com/tdyizhen1314/p/4902560.html 注:从其它地方转的非常好的一篇文章,值得深究! 这几天调程序(嵌入式linux),发现 ...
- linux下system函数详解
一.system函数的简单介绍 头文件 #include <stdlib.h>函数定义int system(const char * string); 函数说明 system()会调用fo ...
- system函数的总结
最近在看APUE第10章中关于system函数的POSIX.1的实现.关于POSIX.1要求system函数忽略SIGINT和SIGQUIT,并且阻塞信号SIGCHLD的论述,理解得不是很透彻,本文就 ...
- 什么是signal(SIGCHLD, SIG_IGN)函数
什么是signal(SIGCHLD, SIG_IGN)函数 在进行网络编程时候遇到这个函数的使用,自己学习结果如下,有不对请帮忙指正:) signal(SIGCHLD, SIG_IGN) 打开manp ...
- Linux下使用system()函数一定要谨慎
转载自:http://my.oschina.net/renhc/blog/53580 linux尽量避免使用system. 曾经的曾经,被system()函数折磨过,之所以这样,是因为对system( ...
- linux windows c system 函数简介
windows 在windows下的system函数中命令可以不区别大小写! 功 能: 发出一个DOS命令 #include <stdlib.h>int system(char *com ...
- 使用system函数时应该忽略两个信号
在8.13节,我们展示了一个system函数的实现.然而,那个版本没有处理信号.POSIX.1要求system忽略 SIGINT和SIGQUIT并阻塞SIGCHLD.在展示正确处理这些信号的版本之前, ...
- 【C/C++】Linux下使用system()函数一定要谨慎
曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.只是简单的知道用这个函数执行一个系统命令,这远远不够,它的返回值.它所执行命令的返回值以及命令执行失败原 ...
最新文章
- 软件熵:软件开发中推倒重来的过程就是软件熵不断增加的过程
- Linux中为wget命令设置代理
- SpringBoot+MyBatis登录案例
- Web SQL Database 之 SQLite语法
- Mysql数据库表复制操作语句
- EF Core查询标签TagWith
- 【李宏毅机器学习】Brief Introduction of Deep Learning 深度学习简介(p12) 学习笔记
- dropout为什么有效
- 灰度资产管理总规模升至460亿美元
- linux 卸载pppoe,列“State”不属于表 。
- android 双拼输入法,高效输入解决方案——双拼输入法
- toc如何判断 word_在WORD为什么点插入目录显示{TOC\o1
- ViewGroup详解
- standard-version(发版与 Changelog 自动化)
- 【WPS】未安装VBA支持库,无法运行文档中的宏。如需要启用宏功能,请点击这里了解详情。
- 第十一届蓝桥杯省赛第一场原题
- c语言放空一个数组,数组越界真可怕,莫名就闯到了别人家
- 如何批量压缩pdf文件到最小
- UTC时间 GMT时间 本地时间 北京时间 时区 夏令时简要说明
- 【python】身份证号码有效性校验
热门文章
- 凡事预则立不预则废,你有自己的应急基金吗?教你如何理财
- 北师大1903计算机在线答案,[南开大学(本部)]20秋学期(1709、1803、1809、1903、1909、2003、2009 )《程序设计基础(下)》在线作业-2...
- 全民一起玩Python提高篇第十二课:面向对象基本原理与语法(三)
- FreeRTOS学习一(简介)
- 不放弃每一个节日,植树节也能玩H5营销
- 有哪些适合大学生投稿的普刊(社科类)?
- Vmware黑屏解决
- 完善circos做图
- Head First Statistics one 做图规则
- html 的ul是块矿元素吗,食品化学题库单选判断