C 管道的哪一端用于输入,哪一端用于输出?

C 管道的哪一端用于输入,哪一端用于输出?,c,pipe,file-descriptor,C,Pipe,File Descriptor,最近我开始怀疑我错误地使用了管道的末端: 从手册页: 管道()创建一个管道。。pipefd[0]表示数据的读取端 管pipefd[1]指管道的写入端 所以在我的脑海里,我是这样想的: .---------------------------. / /\ | pipedfd[0] pipedfd[1]| | process1 --->

最近我开始怀疑我错误地使用了管道的末端:

从手册页:

管道()创建一个管道。。pipefd[0]表示数据的读取端 管pipefd[1]指管道的写入端

所以在我的脑海里,我是这样想的:

                .---------------------------.
               /                            /\
              | pipedfd[0]       pipedfd[1]|  |
process1 ---> |                            | -----> process2
              | input                output|  |
               \____________________________\/
然而,我在这里使用的代码表明:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
  int pipedfd[2];
  char buf[30];

  pipe(pipedfd);
  printf("writing to file descriptor #%d\n", pipedfd[1]);
  write(pipedfd[1], "test", 5);
  printf("reading from file descriptor #%d\n", pipedfd[0]);
  read(pipedfd[0], buf, 5);
  printf("read \"%s\"\n", buf);

  return 0;
}
#包括
#包括
#包括
内部主(空)
{
int-pipedfd[2];
char-buf[30];
管道(管道);
printf(“写入文件描述符#%d\n”,pipedfd[1]);
写入(pipedfd[1],“测试”,5);
printf(“从文件描述符读取#%d\n”,pipedfd[0]);
读取(pipedfd[0],buf,5);
printf(“读取\%s\”\n,buf);
返回0;
}
也就是说,它写入管道的输出(?)并从管道的输入(?)读取?

如下所示消除歧义:

写入管道写入端的数据由内核缓冲 直到从管道的读取端读取


也就是说,你
fd[0]
,然后
fd[1]
简而言之,在你的图表中交换数字
0
1
,你就得到了我将在下面描述的内容

从Mac OS X手册页:

函数的作用是:创建一个管道(一个允许单向数据流的对象)并分配一对文件描述符。第一个描述符连接到读操作 管道末端;第二个连接到写入端

写入fildes[1]的数据出现在fildes[0]上(即可以从中读取)。这允许将一个程序的输出发送到另一个程序:源的标准输出- 将put设置为管道的写入端;水槽的标准输入设置为管道的读取端。管道本身会一直存在,直到其所有相关的 描述符是封闭的

我将描述它是如何经常使用的,这可能会澄清它。假设您有一个进程并希望生成一个子进程,您希望向其发送命令

  • 首先,调用
    pipe
    ,获取两个文件描述符
  • 然后调用
    fork
    来创建子对象。
    • 在子文件中,关闭写入文件描述符(
      fd[1]
      ),并保持读取文件描述符打开
    • 在父级中,执行相反的操作:关闭读取(
      fd[0]
      )文件描述符,并保持写入描述符打开
  • 现在,父级可以写入管道的“他的”部分(
    fd[1]
    ),子级可以读取另一部分(
    fd[0]

关闭不是必需的,但通常是完成的。如果需要双向通信,则需要第二组文件描述符和第二次调用
管道
,或者使用双向通道,如Unix域套接字或命名管道。

尝试检查读写返回的错误,所有错误都会变清楚。管道的读取端=读取位置=
pipefd[0]
(不是你在图表中写的那个部分)。听起来很简单。@Jon当我想到一个物理管道时,我认为它有一个角用于输入(取水)和一个角用于输出(放水)。我认为水不会流动(写)到管道的输出。这与我头脑中的直觉相反。不,我不是一个普卢默人。@Pithikos:在这种情况下,物理管道隐喻真的弊大于利。:)图表中的箭头与它们应该的方向相反。把它们画成相反的方向。@JonPurdy:是的,他的代码就是这样做的,他的图表(和理解)是相反的