C 在fork之后,父进程和子进程是否共享由管道创建的文件描述符?
根据我的理解,fork创建的子进程不与其父进程共享变量。那么,为什么父进程可以写入一个文件描述符,而子进程可以通过读取另一个文件描述符来获取数据呢。这是因为它们在内部受到管道函数的控制吗?变量不共享,例如,如果您在子级中写入C 在fork之后,父进程和子进程是否共享由管道创建的文件描述符?,c,linux,multithreading,ubuntu-10.04,C,Linux,Multithreading,Ubuntu 10.04,根据我的理解,fork创建的子进程不与其父进程共享变量。那么,为什么父进程可以写入一个文件描述符,而子进程可以通过读取另一个文件描述符来获取数据呢。这是因为它们在内部受到管道函数的控制吗?变量不共享,例如,如果您在子级中写入文件\u pipes[0]=999,它将不会反映在父级中。文件描述符是共享的(子文件中的FD numberx与父文件中的FD numberx指相同的内容)。这就是为什么(例如)您可以重定向执行其他命令的shell脚本的输出(因为它们共享相同的标准输出文件描述符)。文件描述符(
文件\u pipes[0]=999
,它将不会反映在父级中。文件描述符是共享的(子文件中的FD numberx
与父文件中的FD numberx
指相同的内容)。这就是为什么(例如)您可以重定向执行其他命令的shell脚本的输出(因为它们共享相同的标准输出文件描述符)。文件描述符(包括管道)在fork上重复—子进程以相同的文件描述符表结束,包括stdin/out/err和管道,就像父母在叉子之前一样
根据我的理解,fork创建的子进程不与其父进程共享变量
这并不完全正确--对变量的更改不与父级共享,但是父级在fork之前的值在fork之后对子级都可见
在任何情况下,管道都存在于操作系统中,而不是流程中。因此,写入管道一端的数据对于为另一端持有FD的任何其他进程都是可见的。(如果有多个进程尝试读取数据,则尝试读取数据的第一个进程将获得该数据,而任何其他进程都将丢失该数据。)没错-普通变量不会在父进程和子进程之间共享
但是,管道不是变量。它们是专门为连接两个独立进程而设计的伪文件。当您写入管道时,您并不是在当前进程中更改变量,而是将数据发送到操作系统,并要求操作系统将该数据提供给下一个进程从管道中读取
这就像在磁盘上写入一个真实的文件——除了数据没有写入磁盘,它只是在管道的另一端可用
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);
}