gpt4 book ai didi

c - fork 一个管道子进程

转载 作者:行者123 更新时间:2023-12-02 03:58:23 25 4
gpt4 key购买 nike

派生管道内衬子流程的最佳技术是什么?

我当前的程序需要运行另一个进程,这实际上是由管道链接的几个命令。如果命令失败或成功,我不需要知道命令的输出,所以我使用 fork/exec。

命令行上的等价物是

 /path/to/A arg1 arg2 | /path/to/B argB1 | /path/to/C

注意:使用脚本是不切实际的,因为它的 A/B/C 将来可能会发生变化。

我想到的两种技术是:
  • 递归 fork 。连接下一个 fork 中可用于子级的父级(输入到其父级)输出。
  • 在顶层创建所有管道。
    然后使用一个循环来 fork 所有可以正确连接管道的子节点。
  • 最佳答案

    不要递归 fork 。使 B 成为 A 的子进程并不是一个好主意。例如,如果 B 调用 setsid要在自己的 session 中运行,它将带上不相关的 A。如果 B 死了,A 会得到一个 SIGCHILD,而不是你。特别是,您将无法获得 B 的退货状态。

    这是在一系列管道上 fork n 个 child 的代码草图。警告:我直接在浏览器中输入了代码;可能有很多错别字,我省略了所有错误检查。

    char *executables[n];
    char *args[n];
    int pipes[2*n+2]; /* child i reads from */
    int child_pids[n];
    int ret; /*Error checking omitted; abort if ret ever becomes negative*/
    ret = pipe(pipes);
    for (i = 0; i < n; i++) {
    ret = pipe(pipes + 2 * i + 2);
    ret = fork();
    if (ret == 0) {
    /* Code of child i */
    close(pipes[2*i+1]);
    close(pipes[2*i+2]);
    dup2(pipes[2*i], 0);
    dup2(pipes[2*i+3], 1);
    ret = execv(executables[i], args[i]);
    }
    close(pipes[2*i]);
    close(pipes[2*i+3]);
    child_pids[i] = ret;
    }
    /* interact with the subprocesses, then call wait or waitpid as needed */

    关于c - fork 一个管道子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11568633/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com