文章目录
摘要
本文尝试使用exec,system,popen函数,来执行一个shell命令。(1) 如果只需要执行命令后的返回值,不关心标准输出,错误输出,可以使用system函数。(2) 如果希望拿到返回值,标准输出,可以使用popen。(2) 如果前面两个函数都不能满足要求,那使用exec,虽然这个比较麻烦。
前言
老实说(To be honest), 在Linux c 中,调用exec/system/popen来执行shell命令,都不太完美。exec的缺点是用起来比较麻烦。system和popen是封装的还不够好。
谈论好/坏之前,需要建立评价标准。或者说,需要实现哪些功能,才算好了。我们参考下Boost.Process,一个C++进程库有哪些功能。
- 创建一个子进程。
- 为子进程设置输入/输出流(为子进程设置输入流,读取子进程的标准输出/错误输出)(同步和异步)。
- 等待进程结束,获取返回码(同步和异步)。
- 终止子进程。
system函数,只能拿到返回值; popen只能设置标准输入,或者标准输出,没法单独获取到错误输出。而想要使用exec函数,优雅又安全的实现上面功能,不容易,挺不容易。
哎呀,凑活着用就是嘞,像生活一样。
exec函数的使用
参考: exec(3) - Linux manual page , 《unix环境高级编程》8.10 函数exec
这个函数不太好写,我也不咋喜欢用,因为有些麻烦。我们看下面这个示例。
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <syslog.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
openlog("exec", LOG_PERROR, 0);
char *cmd = "ls";
char *ls_argv[] = {
"ls", "-alh", "NO_EXIST_FILE", NULL};
pid_t pid;
if ((pid = fork()) < 0) {
syslog(LOG_ERR, "fork error")