LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1362|回复: 7

文件IO和标准IO库疑问

[复制链接]
发表于 2007-7-26 15:55:57 | 显示全部楼层 |阅读模式
我们在写客户-服务器程序时(或者其他程序),经常进行IO操作(如:read、write、fgets、fputs等),看了很多程序,经常有同时使用文件IO(read、write等)和标准IO库(fgets、fputs等),我只知道这两种IO使用上有个很多的区别是缓冲的问题,但是,不太明白什么时候应该选择哪种IO会比较好,比如,下面的一段客户端的程序,为什么要这样选择IO操作呢?

  1. while (fgets(sendline, MAXLINE, fp) != NULL) {
  2.     write(sockfd, sendline, sizeof(sendline));
  3.     if (read(sockfd, recvline, MAXLINE) == 0) {
  4.         perror("read()");
  5.         exit(-1);
  6.     }
  7.     fputs(recvline, stdout);
  8. }
复制代码
发表于 2007-7-27 08:36:15 | 显示全部楼层
Post by ratcj
我们在写客户-服务器程序时(或者其他程序),经常进行IO操作(如:read、write、fgets、fputs等),看了很多程序,经常有同时使用文件IO(read、write等)和标准IO库(fgets、fputs等),我只知道这两种IO使用上有个很多的区别是缓冲的问题,但是,不太明白什么时候应该选择哪种IO会比较好,比如,下面的一段客户端的程序,为什么要这样选择IO操作呢?
  1. while (fgets(sendline, MAXLINE, fp) != NULL) {
  2.     write(sockfd, sendline, sizeof(sendline));
  3.     if (read(sockfd, recvline, MAXLINE) == 0) {
  4.         perror("read()");
  5.         exit(-1);
  6.     }
  7.     fputs(recvline, stdout);
  8. }
复制代码

使用标准IO就不需要自己维护缓冲区了,标准IO库会根据stdin/stdout来选择缓冲类型,也就是说当你使用标准IO的时候,要清楚它的stdin/stdou是什么类型以及其默认的缓冲模式,如果不合适,你需要用setvbuf先设置,再使用,例如协同进程的标准输入和输出的类型都是管道,所以其默认的缓冲类型是全缓冲的,如果要使用标准IO,就需要现设置行缓冲
对于文件IO,只要你自己能维护好缓冲区,完全可以不用标准IO
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-27 11:32:32 | 显示全部楼层
嗯,我明白的也就是这些,我是想问应该进行怎样的选择对于这两种IO操作,就是说有没有一些什么默认规则或经验数据来让我们选择用哪种IO,还是这仅仅是个人的一种选择,就看你想不想自己维护缓冲区这样的。
回复 支持 反对

使用道具 举报

发表于 2007-7-27 14:05:18 | 显示全部楼层
你可以读一下 Glibc 对这两种方式的说明:
http://www.gnu.org/software/libc ... nd-File-Descriptors
回复 支持 反对

使用道具 举报

发表于 2007-7-28 18:49:08 | 显示全部楼层
Post by wawxdyy

对于文件IO,只要你自己能维护好缓冲区,完全可以不用标准IO

文件IO虽然不使用glibc提供的缓冲方式,但同样会使用文件系统自带的缓冲机制。
回复 支持 反对

使用道具 举报

发表于 2007-7-29 09:14:14 | 显示全部楼层
Post by realtang
文件IO虽然不使用glibc提供的缓冲方式,但同样会使用文件系统自带的缓冲机制。

能说得详细点吗,文件系统是内核的一部分,它自带的也应该属于内核缓冲区,用户不用关心吧
回复 支持 反对

使用道具 举报

发表于 2007-7-29 09:39:30 | 显示全部楼层
学习内核文件系统以及块设备部分。现在市场对自由程序员的要求已经不止用户态应用程序编程那么简单。请努力提高自身能力。
回复 支持 反对

使用道具 举报

发表于 2007-7-29 10:00:51 | 显示全部楼层
Post by realtang
学习内核文件系统以及块设备部分。现在市场对自由程序员的要求已经不止用户态应用程序编程那么简单。请努力提高自身能力。

是啊,文件系统正好与我做的课题有关,已经研究一阵子了,驱动也是很有用的,现在正在看,不过遇到了一个问题,就llseek那个帖子,能指教一二吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表