Linux下C语言执行系统指令,获取返回码、标准输出及标准错误

这篇博客介绍了在Linux环境下,如何使用C语言通过fork、dup2和exec函数组合来执行命令,并同时捕获标准输出和标准错误。通过创建管道和子进程,实现了对命令执行结果的独立获取,确保了错误信息和输出信息的分离。示例代码展示了具体的实现细节。
摘要由CSDN通过智能技术生成

概述

Linux下,想在C语言中执行命令,大概有三种方法:systempopenexec

  • system:使用简单,但是只能获取到返回码,不能拿到标准输出和标准错误;
  • popen:只能拿标准输出,不能拿到返回码和标准错误(其实可以通过指令重定向的方式将标准错误重定向到标准输出,但是这样做没法判断哪些信息是标准输出,哪此是信息是标准错误)。
  • exec:这是一组函数,可以加载一个外部程序到本进程,相当于将外部程序嵌入到本进程中,调用exec函数成功之后,exec后面的代码将不会再被执行。

思路

  1. 使用fork函数,创建一个子进程;
  2. 在子进程中调用dup2函数将标准输出和标准错重定向到管道;
  3. 在子进程中调用exec函数加载指令进程
  4. 在主进程在通过管道接收标准错误和标准输出,通过wait获取命令进程退出码。

主要代码如下:

int fd_out[2];
int fd_err[2];
pipe(fd_out);
pipe(fd_err);
pid_t pid = fork();
if (pid == 0) {
    close(fd_out[0]);
    close(fd_err[0]);
    dup2(fd_out[1], STDOUT_FILENO);
    dup2(fd_err[1], STDERR_FILENO);
    execvp(args[0], args);
    // execvp调用失败,直接返回-1
    perror("execvp失败");
    return -1;
} else if (pid > 0) {
    close(fd_out[1]);
    close(fd_err[1]);
    char buffer[1024] = {0};
    // 读取标准输出信息
    while(true) {
        int len = read(fd_out[0], buffer, sizeof(buffer));
    }
    // 读取标准错误信息
    while(true) {
        int len = read(fd_err[0], buffer, sizeof(buffer));
    }
        close(fd_err[0]);
        close(fd_out[0]);
        int status = 0;
        // 获取进程退出码
        wait(&status);
    }

源码

码云:cmd-runner
github: cmd-runner

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值