APP下载

shell命令在C语言程式中的呼叫

消息来源:baojiabao.com 作者: 发布时间:2024-05-15

报价宝综合消息shell命令在C语言程式中的呼叫

我们知道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.

2019-07-26 00:48:00

相关文章