【问题标题】:How to get output of exec()?如何获得 exec() 的输出?
【发布时间】:2021-12-15 05:33:47
【问题描述】:

如何获得由 exec() 运行的程序的输出。假设我有这个代码:

int main(int argc, char ** argv) {
    int fid = fork();
    if(fid == 0) {
        execlp("ls", "ls", NULL);
    }
    wait();
    return 0;
}

父进程如何获取ls命令的输出?

【问题讨论】:

    标签: c linux unix fork exec


    【解决方案1】:

    exec 系列函数完全替代了当前进程。但是,除非它们标记为 close-on-exec,否则它们不会关闭文件描述符。因此,执行此操作的典型方法是创建一个管道,其中读取端属于父级,写入端属于子级。

    这看起来像这样(省略了错误检查并且显然效率低下):

    #include <stdint.h>
    #include <sys/wait.h>
    #include <unistd.h>
    
    int main(int argc, char ** argv) {
        int pipefd[2];
        int status;
        uint8_t buf[256];
    
        pipe(pipefd);
    
        int fid = fork();
        if(fid == 0) {
            close(pipefd[0]);
            dup2(pipefd[1], 1);
            close(pipefd[1]);
            execlp("ls", "ls", NULL);
        }
        close(pipefd[1]);
    
        while (read(pipefd[0], buf, 1) > 0)
            write(1, buf, 1);
        wait(&status);
        return 0;
    }
    

    请注意,要将管道文件描述符附加到标准输出(FD 1),您需要使用dup2。您还需要关闭不使用的管道末端,否则您可能永远不会到达文件末尾。

    如果您对退出状态感兴趣,wait(或waitpid)将为您提供;请参阅手册页了解如何确定它是否正常退出,如果是,该状态是什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-16
      • 2011-11-09
      • 2010-11-26
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      相关资源
      最近更新 更多