gpt4 book ai didi

c - 我是否必须为 C 中的每对进程创建一个新管道?

转载 作者:太空宇宙 更新时间:2023-11-04 01:39:45 25 4
gpt4 key购买 nike

如果我有 4 个进程要通过管道传输:

process1  |  process2  |  process3  |  process4

我必须像这样制作 3 个单独的管道吗

int pipe1[2];
int pipe2[2];
int pipe3[2];

或者我能以某种方式回收管道名称,就像在这个伪代码中一样:

int pipe1[2];             // we use ONLY two pipe names: pipe1
int pipe2[2]; // and pipe2

pipe(pipe1); // getting 2 file descriptors here
pipe(pipe2); // and 2 here

for process=1 to 4
if (process==3) // getting 2 new file descriptors for
pipe(pipe1); // process3|process4 (reusing pipe1)

fork() // forking here
if (child 1) then
use pipe1
if (child 2) then
use pipe1
use pipe2
if (child 3) then
use pipe2
use pipe1 //the pipe1 that we re-pipe()ed
if (child 3) then
use pipe1 //the pipe1 that we re-pipe()ed

这行得通吗?我不确定重新管道化 pipe1 是否会对之前使用 pipe1 的 fork 进程产生影响。

最佳答案

简答:不,“repiping” pipe1 不会对之前使用 pipe1 的 fork 进程产生影响,但你最好在 fork() 之前声明 3 个管道和 pipe()'ing。

长答案:要理解原因,让我们先看看当您创建一个“管道”时会发生什么,然后再看看当您“ fork ”一个进程时会发生什么。

当你调用 pipe() 时,它“创建一个管道(一个允许单向的对象 数据流)并分配一对文件描述符。第一个描述符连接到管道的读端;第二个连接到写入端。”(这是来自手册页)

这些文件描述符存储在您传递给它的 int 数组中。

当您调用 fork() 时,“新进程(子进程)应是调用进程的精确副本”(来自 man fork() 页面)

换句话说,父进程将创建一个子进程,该子进程将拥有它自己的数据副本。

因此,当子进程 3 调用 pipe(pipe1) 时,它将创建一个新管道,并将新文件描述符存储在 pipe1 变量的自己的副本中,而不修改任何其他进程的 pipe1。

即使你可以只声明两个管道变量并在子 3 中调用 pipe() ,但它不是很容易阅读,并且其他人(包括你自己)稍后会在他们不得不看你的时候感到困惑代码。

有关 fork() 和 pipe() 的更多信息,请查看 http://beej.us/guide/bgipc/output/html/multipage/index.html

关于c - 我是否必须为 C 中的每对进程创建一个新管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7870006/

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