到底哪一个管道是输入和输出?

我一直在很多天斗与管道和叉子。 最近,我开始怀疑我用管的端部错误。

从手册页:

管()创建一个管道.. ..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; }

即它写到管的输出(α)和来自输入(?)的管的读? 这是怎么回事全能的上帝?

--------------解决方案-------------

简而言之,交换数字01的图表中,你得到了什么,我会在下面说明。

从Mac OS X的手册页:

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

写入数据菲尔德斯[1]出现在(即可以读取)菲尔德斯[0]。 这允许一个程序的输出被发送到另一个程序:源的标准输出被设置为在管道的写入端; 水槽的标准输入被设置为在管道的读端。 管道本身一直持续到它的所有相关描述符关闭。

我会形容它的使用频率,可能它清除掉。 想象一下,你有一个过程,并希望产生一个孩子,你要发送的命令。

  • 首先,你叫pipe并获得两个文件描述符。
  • 然后调用fork创建子。
    • 在孩子,你关闭写文件描述符( fd[1]并留下读取一个开放的。
    • 在父,你做的相反:关闭阅读fd[0]文件描述符,并留下一个打开。
  • 现在母体可以写入配管的“他”的部分( fd[1]和儿童可在其他读( fd[0]

封闭是没有必要的,但通常进行。 如果您需要双向通信您可能需要第二组文件描述符加上第二个呼叫pipe ,或者你使用类似Unix的域套接字或命名管道一个双向通道。

对于Linux手册页pipe disambiguates此如下:

写入到管的写入结束数据是由内核,直到它从管的读端读缓冲。

也就是说,你readfd[0]writefd[1]

分类:C# 时间:2012-07-19 人气:0
本文关键词: 文件描述符,管,端
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 2.260 (s). 10 q(s)