如何获取 exec() 的输出?

How to get output of exec()?

如何通过 exec() 获取程序 运行 的输出。假设我有这段代码:

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

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

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)将为您提供;请参阅手册页,了解如何确定它是否正常退出,如果是,状态是什么。