q09*_*987 9 c linux multithreading ubuntu-10.04
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);
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,fork创建的子进程不与其父进程共享变量.然后,为什么父母可以写入一个文件描述符,子进程可以通过读取另一个文件描述符来获取数据.这是因为它们是由内部的管道功能以某种方式控制的吗?
dus*_*uff 17
文件描述符(包括管道)被复制fork- 子进程以相同的文件描述符表结束,包括stdin/out/err和管道,因为父进程在fork之前.
根据我的理解,fork创建的子进程不与其父进程共享变量.
这并非完全正确 - 对变量的更改不会与父级共享,但父级在fork之前的值对于子级之后都是可见的.
在任何情况下,管道都存在于操作系统内,而不在进程内.因此,写入管道一端的数据对于另一端持有FD的任何其他过程都是可见的.(如果多个进程尝试读取数据,则尝试数据的第一个进程read()会获取数据,并且任何其他进程都会丢失.)
变量不共享,例如,如果您file_pipes[0] = 999在孩子中写入,它将不会反映在父级中.文件描述符是共享的(x子编号x中的FD编号与父编号中的FD编号相同).这就是为什么(例如)您可以重定向执行其他命令的shell脚本的输出(因为它们共享相同的标准输出文件描述符).
| 归档时间: |
|
| 查看次数: |
13946 次 |
| 最近记录: |