我正在开发一个使用 execvp 执行程序的程序。它需要捕获子进程的结果并在主进程中解析它们。似乎有一种方法,使用命名管道和重复。我正在努力寻找一个很好的例子,但到目前为止还没有运气。如果有人对此有任何指示、链接和/或建议,我将不胜感激。

最佳答案

你不需要命名管道;未命名的管道工作得很好。实际上,通常您可以只使用 popen 而不是自己执行 pipe/fork/dup/execpopen 的工作原理是这样的(尽管您的 libc 的实现可能有更多的错误检查):

FILE *popen(const char *command, const char *type) {
    int fds[2];
    const char *argv[4] = {"/bin/sh", "-c", command};
    pipe(fds);
    if (fork() == 0) {
        close(fds[0]);
        dup2(type[0] == 'r' ? 0 : 1, fds[1]);
        close(fds[1]);
        execvp(argv[0], argv);
        exit(-1);
    }
    close(fds[1]);
    return fdopen(fds[0], type);
}

这将创建一个未命名的管道和 fork s。在子进程中,它将 stdout(或 stdin)重新连接到管道的一端,然后 exec 是子进程。父级可以简单地从管道的另一端读取(或写入)。

关于unix - 如何捕获execvp的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/762200/

10-12 06:56