linux文件设备与I/O:C标准I/O函数与无缓冲I/O

转载 2015年07月08日 09:20:10
open,read,write,close,lseek,fcntl,ioctl,mmap等系统函数称为无缓冲I/O--unbuffer I/O 函数,因为它们位于C标准库的I/O缓冲区的底层。      
                 
    程序在读写文件时既可以调用C标准I/O库函数,也可以直接调用底层的Unbuffered I/O函数,那么用哪一组函数好呢?
   1。用Unbuffered I/O函数每次读写都要进内核,调一个系统调用比调一个用户空间的函数要慢很多,所以在用户空间开辟I/O缓冲区还是必要的,用C标准I/O库函数就比较方便,省去了自己管理I/O缓冲区的麻烦。
2。 用C标准I/O库函数要时刻注意I/O缓冲区和实际文件有可能不一致,在必要时需调用fflush(3) 。
3。 我们知道UNIX的传统是Everything is a file,I/O函数不仅用于读写常规文件,也用于读写 设备,比如终端 或网络设备。在读写设备时通常是不希望有缓冲的,例如向代表网络设备的文件写数据就是希望数据通过网络设备发送出去,而不希望只写到缓冲区里就算完事儿了,当网络设备接收到数据时应用程序也希望第一时间被通知到,所以网络编程通常直接调用Unbuffered I/O函数。

     C标准库函数是C标准的一部分,而Unbuffered I/O函数是UNIX标准的一部分,在所有支持C语
言的平台上应该都可以用C标准库函数(除了有些平台的C编译器没有完全符合C标准之外),而只有在UNIX平台上才能使用Unbuffered I/O函数,所以C标准I/O库函数在头文件stdio.h中声明,而read 、write 等函数在头文件unistd.h 中声明。在支持C语言的非UNIX操作系统上,标准I/O库的底层可能由另外一组系统函数支持,例如Windows系统的底层是Win32 API,其中读写文件的系统函数是ReadFile 、WriteFile 。

      程序启动时会自动打开三个文件:标准输入、标准输出和标准错误输出。在C标准库中分别用FILE *指针stdin 、stdout和stderr表示。这三个文件的描述符分别是0、1、2,保存在相应的FILE 结构体中。头文件unistd.h 中有如下的宏定义来表示这三个文件描述符:
    #define STDIN_FILENO 0
    #define STDOUT_FILENO 1
    #define STDERR_FILENO 2



下面说明C标准I/O库函数是如何用系统调用实现的。
fopen(3)
     调用open(2)打开指定的文件,返回一个文件描述符(就是一个int 类型的编号),分配一
     个FILE 结构体,其中包含该文件的描述符、I/O缓冲区和当前读写位置等信息,返回这
     个FILE 结构体的地址。
fgetc(3)
     通过传入的FILE *参数找到该文件的描述符、I/O缓冲区和当前读写位置,判断能否
     从I/O缓冲区中读到下一个字符,如果能读到就直接返回该字符,否则调用read(2),把文
     件描述符传进去,让内核读取该文件的数据到I/O缓冲区,然后返回下一个字符。注意,对
     于C标准I/O库来说,打开的文件由FILE *指针标识,而对于内核来说,打开的文件由文件
     描述符标识,文件描述符从open 系统调用获得,在使用read 、write 、close 系统调用时都
     需要传文件描述符。
fputc(3)
     判断该文件的I/O缓冲区是否有空间再存放一个字符,如果有空间则直接保存在I/O缓冲区
     中并返回,如果I/O缓冲区已满就调用write(2) ,让内核把I/O缓冲区的内容写回文件。
fclose(3)
     如果I/O缓冲区中还有数据没写回文件,就调用write(2) 写回文件,然后调用close(2) 关闭
     文件,释放FILE 结构体和I/O缓冲区。

文件I/O和标准I/O的区别

一、先来了解下什么是文件I/O和标准I/O: 文件I/O:文件I/O称之为不带缓存的IO(unbuffered I/O)。不带缓存指的是每个read,write都调用内核中的一个系统调用。也就是一般所...
  • zqixiao_09
  • zqixiao_09
  • 2016年01月01日 10:12
  • 2540

文件I/O和标准I/O的使用

文件I/O和标准I/O的简单比较
  • hitxingkong
  • hitxingkong
  • 2015年11月04日 21:50
  • 389

无缓冲I/O与有缓冲I/O区别

无缓冲I/O :不是内核不提供缓冲,而是对于用户层来说,没有提供缓存,而对内核来说还是有缓存的 数据:数据流->内核缓存->磁盘 有缓冲I/O:是指在用户层上再建立了一层缓存区(流缓存区),目的是...
  • u012349696
  • u012349696
  • 2016年04月14日 19:58
  • 475

底层文件I/O和ANSI标准I/O的区别

一、先来了解下什么是文件I/O和标准I/O: 文件I/O:文件I/O称之为不带缓存的IO(unbuffered I/O)。不带缓存指的是每个read,write都调用内核中的一个系统调用。也就是...
  • owen7500
  • owen7500
  • 2016年11月21日 20:45
  • 788

C语言标准I/O函数及其特点总结

C语言的标准I/O库通过系统调用同内核打交道,内核通过驱动和硬件打交道。由于CPU要处理很多任务,所以和低速的I/O的交互一般要经过中间的缓存。    标准I/O库有几个常用函数,虽然很常见,但是其...
  • a1510685338
  • a1510685338
  • 2015年03月16日 20:24
  • 1369

标准i/o缓冲区类型详解

标准I/O库提供缓冲的目的是尽可能地减少使用read和write调用的次数。他也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。不幸的是,标准I/O库最令人迷惑的也是他...
  • zzhfighting
  • zzhfighting
  • 2015年08月10日 19:13
  • 829

浅谈标准I/O缓冲区

标准I/O库提供缓冲的目的是尽可能地减少使用read和write调用的次数。它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。不幸的是,标准I/O库最令人迷惑的也是它...
  • tennysonsky
  • tennysonsky
  • 2015年02月04日 19:36
  • 1791

关于高速缓存和I/O高速缓冲的讲解

1. 磁盘高速缓存(Disk Cache) 操作系统中使用磁盘高速缓存技术来提高磁盘的I/O速度,对高速缓存复制的访问要比原始数据访问更为高效。例如,正在运行的进程的指令既存储在磁盘上,也存储在物理...
  • abel__ing
  • abel__ing
  • 2015年09月13日 10:25
  • 1091

I/O通道

1、I/O通道设备的引入(I/O Channel) ---- 在CPU与I/O设备之间增加了设备控制器后,已能大大减少CPU对I/O的干预,但当主机所配置的外设很多时,CPU的负担仍然很重。 为此,在...
  • dongyanxia1000
  • dongyanxia1000
  • 2016年07月01日 11:30
  • 502

C语言文件读写标准I/O库函数的相关操作

C语言文件的相关操作文件的介绍文件的打开和关闭字符读写函数字符串读写函数格式化的读写函数二进制的读写函数文件定位标准I/O是会分配缓存的。文件的介绍:1:文件的概念所谓“文件”是指一组相关数据的有序集...
  • qq_29924041
  • qq_29924041
  • 2017年02月12日 19:39
  • 568
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux文件设备与I/O:C标准I/O函数与无缓冲I/O
举报原因:
原因补充:

(最多只允许输入30个字)