gpt4 book ai didi

c - fork之后,父子进程是否共享pipe创建的文件描述符?

转载 作者:IT王子 更新时间:2023-10-29 00:09:29 29 4
gpt4 key购买 nike

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 创建的子进程不与其父进程共享变量。那么,为什么在这里父进程可以写入一个文件描述符而子进程可以通过从另一个文件描述符读取来获取数据。这是因为它们在内部由管道功能以某种方式控制吗?

最佳答案

文件描述符,包括管道,在 fork 上被复制——子进程以相同的文件描述符表结束,包括 stdin/out/err 和管道,就像父进程之前拥有的一样 fork 。

Based on my understanding, the child process created by fork doesn't share variables with its parent process.

这不完全正确——对变量的更改不会与父级共享,但是父级在 fork 之前立即拥有的值在 fork 之后对子级都是可见的。

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

关于c - fork之后,父子进程是否共享pipe创建的文件描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6645567/

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