对于管道文件的疑惑
时间: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节点???
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会阻塞... 小心处理这种情况...
这种结果对代码的执行来说是正确的... 虽然不是你想要的结果...
注意看你写write的时候是向管道写入了sizeof(buf1)个字节也就是100个字节。总共写了三次...
而读管道的时候读了三次...每次读100个字节... 所以程序的运行结果必然是这样...
你写了三百个字节到管道中... 一次读100个字节. 当然需要读三次...
管道分无名管道和有名管道... 无名管道只是内核维护的一个缓冲区. 与文件系统并无任何关系...
虽然它也有文件描述符... 但是并没有i结点之类的与文件系统相关的数据结构... 所以只有通过fork的父子进程能够通过管道来进行进程间通信.
具体我也不知道现在的内核是如何实现的... 总之就是内核维护的缓冲区... 就像Glibc输入输出里..
由库来维护的输入输出缓冲区一样。
你把sizeof(buf1)就可以得到想要的结果了... 但是后面的两次read会阻塞... 小心处理这种情况...
作者: PCliangtao 发布时间: 2010-09-19
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28