免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1686 | 回复: 2
打印 上一主题 下一主题

[操作系统] 对于管道文件的疑惑 [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-19 19:54 |只看该作者 |倒序浏览
程序代码,如下:
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节点???

论坛徽章:
0
2 [报告]
发表于 2010-09-19 22:37 |只看该作者
本帖最后由 PCliangtao 于 2010-09-19 22:38 编辑

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

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

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

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
3 [报告]
发表于 2010-09-20 23:54 |只看该作者
这样啊……下次试下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP