版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
据说有统计数据表明,代码的缺陷率是一定的,与所使用的语言无关。Linux提供了很多的实用工具和脚本,在程序中调用工具和脚本,无疑可以简化程序,从而降低代码的缺陷数目。Linux shell 脚本也是一个强大的工具,我们可以根据需要编制脚本,然后在程序中调用自定义脚本。
《Unix 编程艺术》中有一句话“一行 Shell 脚本胜过万行 C”。那么在 Linux 编程中,C 程序如何调用 shell 命令,又如何获取该命令的返回结果呢?下面我们一起来看一下吧。
1. 调用 shell 命令
一般来说,在Linux 系统中使用 C 程序调用 shell 命令有以下三种常见的方法:system()、popen()、exec 系列函数。
使用 system() 不需要用户再创建进程,因为它已经封装好了,直接加入 shell 命令即可;使用 popen() 执行 shell 命令,其开销比 system() 小;exec 需要用户 fork/vfork 进程,然后 exec 所需的 shell 命令。
1.1 system()
函数原型
intsystem(constchar*command);
函数说明
system() 会调用 fork() 产生子进程,由子进程来调用/bin/sh -c string来执行参数 string 字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用 system() 期间 SIGCHLD 信号会被暂时搁置,SIGINT 和SIGQUIT 信号则会被忽略。
返回值
如果 system()在 调用 /bin/sh 时失败则返回 127,其他失败原因返回 -1。若参数 string 为空指针(NULL),则返回非零值。如果 system() 调用成功则最后会返回执行 shell 命令后的返回值,但是此返回值也有可能为 system() 调用 /bin/sh 失败所返回的 127,因此最好能再检查 errno 来确认执行成功。
附加说明
在编写具有 SUID/SGID 权限的程序时请勿使用 system(),因为 system() 会继承环境变量,通过环境变