C标准I/O库函数与无缓存的I/O函数

Linux系统中,基于文件描述符的文件操作主要有:带“缓存区”的文件I/O操作和不带“缓存区”的文件I/O操作。

带“缓存区”的文件I/O操作利用C标准库对文件进行读写,大部分函数在头文件stdio.h中声明,称为标准I/O库函数,符合ANSI C标准。

标准I/O库函数包括fopen、fclose、fgetc、fputc、fgets、fputs、fread、fwrite 等函数。在利用标准I/O函数对文件进行操作的时候,需要在内存中开辟一个“缓存区”,这个“缓存区”为程序中的每一个文件使用。

当执行读文件操作时,从磁盘文件将数据先读入内存的“缓存区”,装满后再从内存“缓存区”依次读入接收的变量。当执行写操作的时候,先将数据写入内存的“缓存区”,待内存的“缓存区”装满后,再写入文件。

不带“缓存区”的文件I/O操作,又称为系统调用I/O操作,符合POSIX(Portable Operating System Interface of Unix可移植操作系统接口)标准。包括open,read,write,close,lseek,fcntl,ioctl,mmap等系统函数,它们位于C标准库的I/O“缓冲区”的底层。

程序在读写文件时既可以调用C标准I/O库函数,也可以直接调用底层的无“缓存区”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函数不仅用于读写常规文件,也用于读写设备,比如终端或网络设备。在读写设备时通常是不希望有缓冲的,例如向代表网络设备的文件写数据就是希望数据通过网络设备发送出去,而不希望只写到缓冲区里就算完事儿了,当网络设备接收到数据时应用程序也希望第一时间被通知到,所以网络编程通常直接调用无“缓存区”I/O函数。
   C标准库函数是C标准的一部分,而无“缓存区”I/O函数是UNIX标准的一部分,在所有支持C语言的平台上应该都可以用C标准库函数(除了有些平台的C编译器没有完全符合C标准之外),而只有在UNIX平台上才能使无“缓存区”I/O函数,所以C标准I/O库函数在头文件stdio.h中声明,而read 、write 等函数在头文件unistd.h 中声明。在支持C语言的非UNIX操作系统上,标准I/O库的底层可能由另外一组系统函数支持,例如Windows系统的底层是Win32 API,其中读写文件的系统函数是ReadFile 、WriteFile 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值