我们知道linux中有很多系统函数,那么如果在程序中可能使用系统函数,那是十分方便的,比如我们需要将日期和时间写入到file文件中去,使用系统命令行函数可以这样:
因此在标准C语言中定义了system函数,它的操作依赖于操作系统,我们来看下它的调用形式:
int system (const char *__command);
该函数需要引入头文件stdlib.h
该函数是用fork,exec,waitpid这3个系统函数实现的,返回值想对比较复杂
1、 如果command为空指针,当系统实现了system函数时,返回非零指针,否则返回零,这是个用来测试系统的system函数是否有效的方法,在一般linux系统中,system都是有效的;
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.