函数system
在程序中执行一个命令字符串很方便,例如,假定要将时间和日期放在某个文件中:通过调用time得到当前日历时间,接着调用localtime将日历时间变换为年、月、日、时、分、秒的分解形式,然后调用strftime对上面的结果进行格式化处理,最后将结果写入到文件中。
|
|
|
|
但是用下面的system函数则更容易做到这一点:
|
|
函数原型:
|
|
如果cmdstring是一个空指针,则仅当命令处理程序可用时,system返回非0值,这一特征可以确定在一个给定的操作系统上是否支持system函数。在UNIX中,system总是可用的。
因为system在其实现中调用了fork、exec和waitpid,因此有3种返回值。
- fork失败或者waitpid返回除EINTR之外的出错,则system返回-1,并且设置errno以指示错误类型。
- 如果exec失败(表示不能执行shell),则其返回值如果shell执行了exit(127)一样。
- 否则所有3个函数(fork、exec和waitpid)都成功,那么system的返回值是shell的终止状态,其格式已在waitpid中说明。
如下给出了system函数的一种实现。它对信号没有进行处理:
|
|
shell的-c选项告诉shell程序取下一个命令行参数(在这里是cmdstring)作为命令输入(而不是从标准输入或从一个给定的文件中读命令)。shell对以null字节终止的字符串进行语法分析,将它们分成命令行参数。传递给shell的命令字符串可以包含任一有效的shell命令。例如,可以用<和>对输入和输出重定向。
注意,我们调用_exit而不是exit。这是为了防止任一标准I/O缓冲(这些缓冲会在fork中由父进程复制到子进程)在子进程中被冲洗。
以下代码对system函数进行测试:
|
|
|
|
使用system而不是直接使用fork和exec的优点是:system进行了所需要的各种出错处理以及各种信号处理。
下面这一块不太懂,以后再看看:
注:如果一个进程正以特殊的权限(设置用户ID或设置组ID)运行,它又想生成另一个进程执行另一个程序,则它应当直接使用fork和exec,而且在fork之后、exec之前要更改会普通权限,设置用户ID或者设置组ID程序绝不应调用system函数。