+ -
当前位置:首页 → 问答吧 → 对于管道文件的疑惑

对于管道文件的疑惑

时间:2010-09-19

来源:互联网

程序代码,如下:
1 #include<stdio.h>
  2 #include<unistd.h>
  3 int main()
  4 {
  5         int fd[2];
  6         char buf1[100],buf2[100];
  7         printf("please input a string:1\n";
  8         gets(buf1);
  9         pipe(fd);
10         write(fd[1],buf1,sizeof(buf1));
11         printf("please input a string:2\n";
12         gets(buf1);
13         write(fd[1],buf1,sizeof(buf1));
14         printf("please input a string:3\n";
15         gets(buf1);
16         write(fd[1],buf1,sizeof(buf1));
17         read(fd[0],buf2,100);
18         printf("pipe read 1:%s\n",buf2);
19         read(fd[0],buf2,100);
20         printf("pipe read 2:%s\n",buf2);
21         read(fd[0],buf2,100);
22         printf("pipe read 3:%s\n",buf2);
23         return 0;
     }
运行结果,如下:
[root@localhost home]# ./pipe
please input a string:1
zhejiang
please input a string:2
hangzhou
please input a string:3
qiandaohu
pipe read 1:zhejiang
pipe read 2:hangzhou
pipe read 3:qiandaohu



说管道是一种文件系统,那么为什么我3次写之后,不能,一次把3次写的数据读出来???
每个文件系统在内核中以i节点来记录它的数据块链表,难道管道文件不是这样的吗???还是说,对管道每写一次就对应一个V节点和i节点???

作者: shaohui973   发布时间: 2010-09-19

本帖最后由 PCliangtao 于 2010-09-19 22:38 编辑

这种结果对代码的执行来说是正确的... 虽然不是你想要的结果...
   注意看你写write的时候是向管道写入了sizeof(buf1)个字节也就是100个字节。总共写了三次...
   而读管道的时候读了三次...每次读100个字节... 所以程序的运行结果必然是这样...
    你写了三百个字节到管道中... 一次读100个字节. 当然需要读三次...

  管道分无名管道和有名管道... 无名管道只是内核维护的一个缓冲区.  与文件系统并无任何关系...
  虽然它也有文件描述符... 但是并没有i结点之类的与文件系统相关的数据结构... 所以只有通过fork的父子进程能够通过管道来进行进程间通信.
  具体我也不知道现在的内核是如何实现的... 总之就是内核维护的缓冲区... 就像Glibc输入输出里..
由库来维护的输入输出缓冲区一样。

你把sizeof(buf1)就可以得到想要的结果了... 但是后面的两次read会阻塞... 小心处理这种情况...

作者: PCliangtao   发布时间: 2010-09-19