免费注册 查看新帖 |

Chinaunix

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

关于fork之后重定向过的标准I/O的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-19 10:27 |只看该作者 |倒序浏览
一个进程将标准输入重定向为一个文件,然后fork一个子进程,按APUE里的说法,应该是两个进程共享所有文件表。
所以子进程对重定位了以后的那个文件的操作对父进程也有效。
如下:
#include<etc....h>
int main(int argc,char** argv)
{
&nbsp;int fd;
&nbsp;pid_t pid;
&nbsp;close(STDIN_FILENO);
&nbsp;fd = open("fin.txt",O_RDONLY);
&nbsp;pid = fork();
&nbsp;if(pid > 0)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(2);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char c;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c = getchar();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("c is %c\n",c);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;else if(0 == pid)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char c;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c = getchar();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("c in child is %c\n",c);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(0);
&nbsp;&nbsp;&nbsp;&nbsp;}
return 0;
}


fork之后子进程先读,如果fin.txt中的内容是abcdefg.子进程可以正确读取为a,读完以后退出,此时父进程的文件偏移应该已经改变,所以应该读到b.
但是上面的程序中读到的却是乱码,请问这是什么原因?

[ 本帖最后由 dilfish 于 2009-6-19 14:56 编辑 ]

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:09
2 [报告]
发表于 2009-06-19 13:34 |只看该作者

回复 #1 dilfish 的帖子

1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <sys/types.h>
  4 #include <sys/stat.h>
  5 #include <fcntl.h>
  6
  7 int main()
  8 {
  9     int fd;
10     pid_t pid;
11
12     close(STDIN_FILENO);
13     fd = open("fin.txt",O_RDONLY);
14     //printf("%d\n",fd);
15
16     pid = fork();
17     if(pid > 0)
18     {
19         char c;
20         sleep(2);
21         read(fd,&c,1);
22         printf("%c \n",c);
23         exit(0);
24     }
25     else if(pid == 0)
26     {
27         char c;
28         read(fd,&c,1);
29         printf("%c ",c);
30         exit(0);
31     }
32
33     return 0;
34 }

你这个程序的错误出在getchar()这个函数上,这个函数从流中读取时,不是一个只读一个字符,默认情况下是读到\n到它的缓冲区中,然后在从缓冲区中取第一个字符。因此,你第一次读后,文件指针已经读到文件尾了,在读就没有东西了,也可能就是乱码了!这里用了read(),是不带缓冲区的I/O,所以读一个字符就是一个字符!

论坛徽章:
0
3 [报告]
发表于 2009-06-19 14:56 |只看该作者
多谢楼上,我没考虑到缓冲的问题,另外open不小心写错了参数,楼上的事正确的。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP