栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

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

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

概述

Linux下,想在C语言中执行命令,大概有三种方法:system、popen、exec。

  • 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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/972481.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号