网易首页 > 网易号 > 正文 申请入驻

关于linux下system()函数的总结

0
分享至

曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入。这里必须要搞懂system()函数,因为有时你不得不面对它。

先来看一下system()函数的简单介绍:

#include
int system(const char *command)

system()函数调用/bin/sh来执行参数指定的命令,/bin/sh 一般是一个软连接,指向某个具体的shell,比如bash,-c选项是告诉shell从字符串command中读取命令; 在该command执行期间,SIGCHLD是被阻塞的,好比在说:hi,内核,这会不要给我送SIGCHLD信号,等我忙完再说; 在该command执行期间,SIGINT和SIGQUIT是被忽略的,意思是进程收到这两个信号后没有任何动作。

再来看一下system()函数返回值:

为了更好的理解system()函数返回值,需要了解其执行过程,实际上system()函数执行了三步操作:

  1. fork一个子进程;
  2. 在子进程中调用exec函数去执行command;
  3. 在父进程中调用wait去等待子进程结束。 对于fork失败,system()函数返回-1。 如果exec执行成功,也即command顺利执行完毕,则返回command通过exit或return返回的值。 (注意,command顺利执行不代表执行成功,比如command:"rm debuglog.txt",不管文件存不存在该command都顺利执行了) 如果exec执行失败,也即command没有顺利执行,比如被信号中断,或者command命令根本不存在,system()函数返回127. 如果command为NULL,则system()函数返回非0值,一般为1.

看一下system()函数的源码

看完这些,我想肯定有人对system()函数返回值还是不清楚,看源码最清楚,下面给出一个system()函数的实现:

int system(const char * cmdstring)
{
pid_t pid;
int status;
if(cmdstring == NULL)
{
return (1); //如果cmdstring为空,返回非零值,一般为1
}
if((pid = fork())<0)
{
status = -1; //fork失败,返回-1
}
else if(pid == 0)
{
execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
_exit(127); // exec执行失败返回127,注意exec只在失败时才返回现在的进程,成功的话现在的
进程就不存在啦~~
}
else //父进程
{
while(waitpid(pid, &status, 0) < 0)
{
if(errno != EINTR)
{
status = -1; //如果waitpid被信号中断,则返回-1
break;
}
}
}
return status; //如果waitpid成功,则返回子进程的返回状态
}

仔细看完这个system()函数的简单实现,那么该函数的返回值就清晰了吧,那么什么时候system()函数返回0呢?只在command命令返回0时。

看一下该怎么监控system()函数执行状态 这里给我出的做法:

int status;
if(NULL == cmdstring) //如果cmdstring为空趁早闪退吧,尽管system()函数也能处理空指针
{
return XXX;
}
status = system(cmdstring);
if(status < 0)
{
printf("cmd: %s\t error: %s", cmdstring, strerror(errno)); // 这里务必要把errno信息输出或
记入Log
return XXX;
}
if(WIFEXITED(status))
{
printf("normal termination, exit status = %d\n", WEXITSTATUS(status)); //取得cmdstring执行结果 }
else if(WIFSIGNALED(status))
{
printf("abnormal termination,signal number =%d\n", WTERMSIG(status)); //如果cmdstring被信号中
断,取得信号值
}
else if(WIFSTOPPED(status))
{
printf("process stopped, signal number =%d\n", WSTOPSIG(status)); //如果cmdstring被信号暂停执
行,取得信号值
}

system()函数用起来很容易出错,返回值太多,而且返回值很容易跟command的返回值混淆。这里推荐使用popen()函数替代,关于popen()函数的简单使用可以自己查下资料。

popen()函数较于system()函数的优势在于使用简单,popen()函数只返回两个值: 成功返回子进程的status,使用WIFEXITED相关宏就可以取得command的返回结果; 失败返回-1,我们可以使用perro()函数或strerror()函数得到有用的错误信息。

这篇文章只涉及了system()函数的简单使用,还没有谈及SIGCHLD、SIGINT和SIGQUIT对system()函数的影响,事实上,之所以今天写这篇文章,是因为项目中因有人使用了system()函数而造成了很严重的事故。现像是system()函数执行时会产生一个错误:“No child processes”。此时调用my_system()来执行system函数的功能(my_system函数中是使用popen()函数来实现的), 测试了一天,没有再次出现程序突然死掉的问题(修改前连续循环调用system()函数测试,每10次就会至少导致程序挂掉一次.连续不停顿的调用)。

  • 原文来自:https://my.oschina.net/renhc/blog/53580
  • 本文地址:https://www.linuxprobe.com/linux-system-constructors.html编辑:郝大发,审核员:苏西云

本文原创地址:https://www.linuxprobe.com/linux-system-constructors.html

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
朝鲜未经授权就转播世界杯比赛,国际足联为什么不管呢?

朝鲜未经授权就转播世界杯比赛,国际足联为什么不管呢?

三年的老核桃
2026-07-18 23:30:03
失联网格员龚宝东推到风口浪尖!毕业于西南政法大学,刚考上公务员,姐姐写下满纸泣诉:我们不要英雄,只要弟弟

失联网格员龚宝东推到风口浪尖!毕业于西南政法大学,刚考上公务员,姐姐写下满纸泣诉:我们不要英雄,只要弟弟

火山詩话
2026-07-19 07:31:06
万斯打响第一枪,特朗普紧随其后,美国要收拾内塔尼亚胡?

万斯打响第一枪,特朗普紧随其后,美国要收拾内塔尼亚胡?

策前论
2026-07-18 20:30:04
意外反击!伊朗导弹首次炸进叙利亚,美国竟出现严重误判

意外反击!伊朗导弹首次炸进叙利亚,美国竟出现严重误判

策前论
2026-07-18 22:10:04
潘粤明案判了,结果大快人心,和董洁长达11年的恩怨终于落幕

潘粤明案判了,结果大快人心,和董洁长达11年的恩怨终于落幕

仙味少女心
2026-07-18 23:48:03
阿根廷足协:国家队回国,20日至21日所有比赛暂停

阿根廷足协:国家队回国,20日至21日所有比赛暂停

懂球帝
2026-07-19 02:57:21
宜家集中出售8座商场:已全面清空,7家商场今年2月刚关停

宜家集中出售8座商场:已全面清空,7家商场今年2月刚关停

齐鲁壹点
2026-07-19 09:07:07
关键领域!美媒:“中国刚刚抹去了美国的领先优势”

关键领域!美媒:“中国刚刚抹去了美国的领先优势”

环球时报国际
2026-07-19 08:15:31
欺负老实人?法国35岁功勋8场世界杯0出场,季军战后德尚摸头安慰

欺负老实人?法国35岁功勋8场世界杯0出场,季军战后德尚摸头安慰

球场没跑道
2026-07-19 08:03:00
“黄总请你去包厢”,女子独自用餐遭服务员多次传话事件核实:是误会,男子误将其认成相识朋友,后致歉双方已和解,餐厅已停业整改

“黄总请你去包厢”,女子独自用餐遭服务员多次传话事件核实:是误会,男子误将其认成相识朋友,后致歉双方已和解,餐厅已停业整改

台州交通广播
2026-07-18 23:51:56
长沙的良心

长沙的良心

张江名媛
2026-07-18 18:21:31
上海迎“雨水密集期”,今局地可达暴雨

上海迎“雨水密集期”,今局地可达暴雨

鲁中晨报
2026-07-19 09:48:06
上海房价正式跌破5万

上海房价正式跌破5万

谭谈财经
2026-07-18 20:20:56
不影响心情,姆巴佩半场休息与图赫尔有说有笑,和赖斯交换了球衣

不影响心情,姆巴佩半场休息与图赫尔有说有笑,和赖斯交换了球衣

懂球帝
2026-07-19 06:29:08
“高考估分715查分299,女孩称试卷不是自己的”,警方:已被行拘

“高考估分715查分299,女孩称试卷不是自己的”,警方:已被行拘

南京择校
2026-07-18 12:18:29
杭州黄总现身!“黄总邀请你去包厢”事件迎来大结局,多部门联合调查后,女方同意和解

杭州黄总现身!“黄总邀请你去包厢”事件迎来大结局,多部门联合调查后,女方同意和解

火山詩话
2026-07-19 06:48:15
周五国家队护盘为什么没有成功?易会满高点3731点和9.24井喷高点3674点能守住吗?

周五国家队护盘为什么没有成功?易会满高点3731点和9.24井喷高点3674点能守住吗?

李志林
2026-07-19 07:00:17
官方辟谣:网传“韩红基金会向和田地区人民医院捐赠医疗设备”为不实信息

官方辟谣:网传“韩红基金会向和田地区人民医院捐赠医疗设备”为不实信息

澎湃新闻
2026-07-19 09:48:18
《战神》剧集突遭重创:主演 Ryan Hurst 拍摄特技时二头肌严重撕裂,拍摄无限期停摆

《战神》剧集突遭重创:主演 Ryan Hurst 拍摄特技时二头肌严重撕裂,拍摄无限期停摆

赴一场山海啊
2026-07-18 01:31:05
穆里尼奥彻底看走眼!皇马新援史诗崩盘,世界杯沦为大笑话

穆里尼奥彻底看走眼!皇马新援史诗崩盘,世界杯沦为大笑话

奶盖熊本熊
2026-07-19 07:47:38
2026-07-19 10:12:49
孙有匪 incentive-icons
孙有匪
科技
1595文章数 2007关注度
往期回顾 全部

科技要闻

WAIC2026看什么?这份"不迷路"攻略请收好

头条要闻

牛弹琴:一觉醒来中东杀红眼 伊朗让美军付出重大代价

头条要闻

牛弹琴:一觉醒来中东杀红眼 伊朗让美军付出重大代价

体育要闻

英格兰集体领铜牌 德尚最后一舞落泪

娱乐要闻

大S给具俊晔留遗产是昏头?实际上她清醒得很

财经要闻

任泽平VIP会员自称爆仓巨亏千万

汽车要闻

把中国超跑卖到英国,比亚迪正在被世界看见

态度原创

数码
艺术
手机
游戏
健康

数码要闻

英特尔前CEO直言当年太傲慢:根本看不上英伟达GPU

艺术要闻

蒋校长和郭沫若同题“黄帝陵”,水平谁高谁低?

手机要闻

WAIC 2026手机观察:从豆包到Agent OS,手机开始接管一切

索尼全新专利被曝光!PS6或解决PS5核心痛点顽疾

刮痧也会刮出脑梗?讲个真实案例

无障碍浏览 进入关怀版