我们知道linux中有很多系统函数,那么如果在程序中可能使用系统函数,那是十分方便的,比如我们需要将日期和时间写入到file文件中去,使用系统命令行函数可以这样:
文章插图
文章插图
因此在标准C语言中定义了system函数,它的操作依赖于操作系统,我们来看下它的调用形式:
int system (const char *__command);
该函数需要引入头文件stdlib.h
该函数是用fork,exec,waitpid这3个系统函数实现的,返回值想对比较复杂
1、 如果command为空指针,当系统实现了system函数时,返回非零指针,否则返回零,这是个用来测试系统的system函数是否有效的方法,在一般linux系统中,system都是有效的;
【第六十一章、C程序中怎么调用Linux中的shell命令】2、 如果command不空,就要根据fork,exec,waitpid这3个系统函数的执行情况确定返回值,若fork出错或waitpid中出现EINTR错误,system返回-1;
3、 如果exec错误返回,表示shell无法执行这个命令,返回值与shell执行exit(127)的返回值相同,
4、 否则,若3个系统函数调用都成功了,返回值shell的结束状态,与前面介绍的waitpid的返回值情况相同 。
我们来看看几个语句的执行返回值:
文章插图
文章插图
文章插图
下面呢我在网上找了下system函数的实现代码,帮助我们理解system函数:
文章插图
我们来看下这个函数,命令sh的"-c"选项指出下一个命令行参数就是命令输入,而不是从标准输入或文件中读取,。sh命令自动对这个以空字符结尾的字符串进行分析,将它分解为独立的命令行参数的形式,并执行这个命令,这个命令可以包括I/O重定向,管道命令等 。
在这里子进程退出时使用了_exit而不是exit,这是为了保证子进程的标准I/O流不被清掉 。
下面我们来看一个具体点的例子:
文章插图
我们来分析下这个程序,第一个system调用,执行命令"date",正确输出当前系统时间,而第二个system调用中,由于命令行为一个非法命令,系统无法执行,运行execl("/bin/sh","sh","-c",cmdstring,(char *)0);时错误返回,接着运行_exit(127)指令,输出错误信息sh: 1: nosuchcommand: not found,第三个system系统调用正确执行,返回值为shell的退出状态11264.
推荐阅读
- 99%的人不知道自己该喝什么茶
- 附睾炎手术
- 进程、线程、协程介绍
- 被隔离没钱交费怎么办?
- 取代H.265/HEVC!H.266编解码标准发布:视频清晰度不变、数据量减半
- 素食的八大好处!看看科学怎么说
- 久用电脑眼睛干涩 就吃这七种果蔬
- 红茶、绿茶、乌龙茶各用什么茶具泡茶?[红茶]
- 红茶含硒吗?[红茶]
- 老电脑升级加固态硬盘还是内存、CPU、显卡?旧电脑升级硬件建议