【问题标题】:Multi Forks controlled by main parent pipe由主父管道控制的多叉
【发布时间】:2010-04-26 12:14:58
【问题描述】:

我有这个代码,它可以正常工作,但如果我更改 NUM_CHILDREN = 2 或任何其他数字“不等于 1”,则它是错误的文件描述符。这是为什么呢?

#include <stdio.h>
#include <unistd.h>

enum {
    NUM_CHILDREN = 1
};

static int pipes[NUM_CHILDREN][2];

void start_encoding(void) {
    pid_t d, h;

    int pipe_master[2];
    pipe(pipe_master);
    if (d = fork()) {
        int j;
        for (j = 0; j < NUM_CHILDREN; j++) {
            int pipe_sub[2];
            pipe(pipe_sub);
            pipes[j][0] = pipe_sub[0];
            pipes[j][1] = pipe_sub[1];
            if (h = fork()) {
                dup2(pipes[j][0], 0);
                close(pipe_master[0]);
                close(pipe_master[1]);
                for (j = 0; j < NUM_CHILDREN; j++) {
                    close(pipes[j][0]);
                    close(pipes[j][1]);
                }
                execl("/bin/sort", "sort", NULL);
            } else {
                close(STDIN_FILENO);
                dup2(pipe_master[0], STDIN_FILENO);
                close(STDOUT_FILENO);
                dup2(pipes[j][1], STDOUT_FILENO);
                close(pipe_master[0]);
                close(pipe_master[1]);
                for (j = 0; j < NUM_CHILDREN; j++) {
                    close(pipes[j][0]);
                    close(pipes[j][1]);
                }
                execl("/bin/sed", "sed", "s/tty/TTY/g", NULL);
            }
        }
    } else {
        close(STDOUT_FILENO);
        dup2(pipe_master[1], STDOUT_FILENO);
        close(pipe_master[0]);
        close(pipe_master[1]);
        execl("/usr/bin/who", "who", NULL);
    }
} 

其实我是想模拟的:

             -- sed
        |---|
        |    -- sort
  who --|
        |    -- sed
        |---|
        |    -- sort
        |
         --- ...

我应该用什么?

【问题讨论】:

    标签: c unix fork pipe


    【解决方案1】:

    因为在这些嵌套循环中:

    for (j = 0; j < NUM_CHILDREN; j++) {
        close(pipes[j][0]);
        close(pipes[j][1]);
    }
    

    您正在尝试关闭尚未创建的文件描述符。您也不能在此处重复使用 j - 您需要为这些内部循环使用不同的变量。

    【讨论】:

      【解决方案2】:

      这段代码:

          for (j = 0; j < NUM_CHILDREN; j++) {
      ...
            if (h = fork()) {
      ...
                  for (j = 0; j < NUM_CHILDREN; j++) {
                      close(pipes[j][0]);
                      close(pipes[j][1]);
                  }
                  execl("/bin/sort", "sort", NULL);
      

      将尝试关闭尚未打开的管道(如果 NUM_CHILDREN > 1)

      对内循环和外循环使用相同的循环变量 (j) 也是一个问题。

      另一个问题是您正在从 父级 执行 execl("/bin/sort"),因此外部循环永远不会超过第一次迭代。

      【讨论】:

      • 如果你不介意,你能告诉我正确的方法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 2020-04-10
      • 2014-11-04
      • 1970-01-01
      相关资源
      最近更新 更多