Linux C 中执行shell命令

摘要

本文尝试使用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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

da1234cao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值