【C/C++】Linux下使用system()函数一定要谨慎
1
2
|
#include <stdlib.h>
int system ( const char *command);
|
system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed. During execution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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时。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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被信号暂停执行,取得信号值
}
|
到于取得子进程返回值的相关介绍可以参考另一篇文章:http://my.oschina.net/renhc/blog/35116
system()函数用起来很容易出错,返回值太多,而且返回值很容易跟command的返回值混淆。这里推荐使用popen()函数替代,关于popen()函数的简单使用也可以通过上面的链接查看。
popen()函数较于system()函数的优势在于使用简单,popen()函数只返回两个值:
成功返回子进程的status,使用WIFEXITED相关宏就可以取得command的返回结果;
失败返回-1,我们可以使用perro()函数或strerror()函数得到有用的错误信息。
这篇文章只涉及了system()函数的简单使用,还没有谈及SIGCHLD、SIGINT和SIGQUIT对system()函数的影响,事实上,之所以今天写这篇文章,是因为项目中因有人使用了system()函数而造成了很严重的事故。现像是system()函数执行时会产生一个错误:“No child processes”。
关于这个错误的分析,感兴趣的朋友可以看一下:http://my.oschina.net/renhc/blog/54582
2012-04-14 qdurenhongcai@163.com
转载请注明出处。
【C/C++】Linux下使用system()函数一定要谨慎相关推荐
- Linux下使用system()函数一定要谨慎
转载自:http://my.oschina.net/renhc/blog/53580 linux尽量避免使用system. 曾经的曾经,被system()函数折磨过,之所以这样,是因为对system( ...
- Linux下使用system函数获取命令执行返回结果
在Linux C语言中,需要获取设备挂载和空间容量信息,这时候最简单的方式就是使用命令工具进行查询,但是system函数调用之能返回进行执行的状态,不能返回执行的结果:所以这里自己实现system函数 ...
- linux getline参数,Linux下的getline函数
最近在做国嵌的mp3项目,在mp3主控程序中用到了这个函数,挺好使的,在这里记录一下.注意是linux下的,不是C++中的. 函数原型 ssize_t getline(char **lineptr, ...
- linux windows c system 函数简介
windows 在windows下的system函数中命令可以不区别大小写! 功 能: 发出一个DOS命令 #include <stdlib.h>int system(char *com ...
- sleep头文件linux,Linux下的sleep函数 要用的话得包涵什么头文件啊?
Linux下的sleep函数 要用的话得需要#include sleep把进程的运行状态改为睡眠,将其从系统可执行队列去掉,这样系统就不会调度到该进程,不会分配CPU时间片,同时根据该进程的睡眠时间, ...
- linux父进程中显示子进程pid,请教linux下c语言函数fork父进程打印子进程的PID
请教linux下c语言函数fork父进程打印子进程的PID 关注:296 答案:2 信息版本:手机版 解决时间 2019-01-14 04:55 雨不眠的下 2019-01-13 12:23 用于 ...
- [转帖]关于Linux下的icotl函数
关于Linux下的icotl函数 最近接触android开发,因为有时间所以就关注了下android的源码,在跟踪源码过程中到最后都会遇到icotl函数,虽然在Symbian中曾经遇到过RSocket ...
- Linux下的延时函数
Linux下的延时函数 1.sleep函数 头文件:#include<unistd.h> 功能:执行挂起操作一段时间,以秒为单位 一般形式:unsigned sleep(unsigned ...
- Linux下无法使用 itoa 函数的解决方法
起因 在Linux环境下进行C++编程,使用 itoa 函数时出现以下错误: ' itoa ' was not declared in this scope. 翻阅Linux下的 stdlib.h 头 ...
最新文章
- PyTorch框架:(2)使用PyTorch框架构建神经网络模型---气温预测
- Hinton团队CV新作:用语言建模做目标检测,性能媲美DETR
- 最近一段时间开发客户端app的感悟
- devc 能优化吗_SEO关键词推广要多少钱?关键词优化选择外包靠谱吗?
- 03.elasticsearch pipeline aggregation查询
- C语言中无符号数和有符号数相加问题
- matlab的边缘检测方法,常用图像边缘检测方法及Matlab研究
- spark 源码分析之十九 -- DAG的生成和Stage的划分
- 在线HTTP请求/响应头转JSON工具
- Python字符串join()方法
- 【SICP练习】151 练习4.7
- webservice 传输数据过大,解析失败
- python操作redis集群是连接池么_python使用连接池操作redis数据库
- 在win 10系统下安装VS 2015
- Visio模具与模版
- opencv2 Mat类copyTo()函数的内存泄露问题
- PX4 ---- Mixer
- 2019个税计算公式(附最新个税计算器)
- 融云 java_融云开发者文档
- 重新认识受控和非受控组件
热门文章
- matplotlib 折线图_漂亮图表也可信手拈来,一文学会用Python绘制堆积折线图
- php get raw,file_get_contents(“php:// input”)或$ HTTP_RAW_POST
- java中链式调用_Java及Android中常用链式调用写法简单示例
- c++ 为什么要按它们声明的顺序初始化成员变量?
- 节点式光端机与点对点式光端机的区别
- 如何预防光纤光缆布线中的雷击伤害
- 【渝粤题库】国家开放大学2021春2108刑法学(2)题目
- 地理科学师范计算机,地理科学师范考研方向指导参考
- #让人物运动_篮球人物之黄云龙,淡泊名利的他是篮球运动员中的楷模,你可记得...
- 马尔可夫蒙特卡罗 MCMC 原理及经典实现