【问题标题】:After fork, do the parent and child process share the file descriptor created by pipe?fork后,父子进程是否共享pipe创建的文件描述符?
【发布时间】:2011-10-02 12:00:00
【问题描述】:
int main()
{
    int data_processed;
    int file_pipes[2];
    const char some_data[] = "123";
    char buffer[BUFSIZ + 1];
    pid_t fork_result;

    memset(buffer, '\0', sizeof(buffer));

    if (pipe(file_pipes) == 0) {
        fork_result = fork();
        if (fork_result == -1) {
            fprintf(stderr, "Fork failure");
            exit(EXIT_FAILURE);
        }

// We've made sure the fork worked, so if fork_result equals zero, we're in the child process.

        if (fork_result == 0) {
            data_processed = read(file_pipes[0], buffer, BUFSIZ);
            printf("Read %d bytes: %s\n", data_processed, buffer);
            exit(EXIT_SUCCESS);
        }

// Otherwise, we must be the parent process.

        else {
            data_processed = write(file_pipes[1], some_data,
                                   strlen(some_data));
            printf("Wrote %d bytes\n", data_processed);
        }
    }
    exit(EXIT_SUCCESS);
}

据我了解,fork 创建的子进程不与其父进程共享变量。那么,为什么这里父进程可以写入一个文件描述符,而子进程可以通过从另一个文件描述符读取数据。这是因为它们在内部受到管道功能的某种控制吗?

【问题讨论】:

    标签: c linux multithreading ubuntu-10.04


    【解决方案1】:

    文件描述符(包括管道)在 fork 上重复——子进程最终得到相同的文件描述符表,包括 stdin/out/err 和管道,就像父进程在 fork 之前一样。

    据我了解,fork 创建的子进程不与父进程共享变量。

    这并不完全正确 - 变量的更改不会与父级共享,但父级在分叉之前拥有的值在之后对子级都是可见的。 p>

    在任何情况下,管道都存在于操作系统中,而不是进程中。因此,写入管道一端的数据对于持有另一端 FD 的任何其他进程都是可见的。 (如果有多个进程尝试读取数据,第一个尝试read() 数据的进程会得到它,而其他任何进程都会错过。)

    【讨论】:

      【解决方案2】:

      变量不共享,例如如果你在child中写file_pipes[0] = 999,它不会反映在parent中。文件描述符是共享的(子中的FD编号x与父中的FD编号x指的是相同的东西)。这就是为什么(例如)您可以重定向执行其他命令的 shell 脚本的输出(因为它们共享相同的标准输出文件描述符)。

      【讨论】:

        【解决方案3】:

        你是对的 - 普通变量在父母和孩子之间共享。

        但是,管道不是变量。它们是专门设计用于将两个独立进程连接在一起的伪文件。当您写入管道时,您不会更改当前进程中的变量 - 您将数据发送到操作系统并要求它使该数据可用于下一个进程以从管道读取。

        这就像你写入一个真实的磁盘文件一样 - 除了数据没有写入磁盘,它只是在管道的另一端可用。

        【讨论】:

          猜你喜欢
          • 2011-05-15
          • 2014-02-26
          • 1970-01-01
          • 1970-01-01
          • 2014-02-15
          • 2014-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多