流和文件的区别

前面介绍的Linux下的文件编程所涉及的操作方式都是不带缓冲的I/O,因为每次调用相应的函数比如说read、write等对文件进行操作的时候都会调用内核的系统调用,由于每次都要通过内核对文件进行操作,所以操作效率比较低,对于流编程来说,首先对文件所映射的流进行操作,然后分阶段将相应的数据写入文件,极大地提高了相应的操作效率。Linux也提供了很多流操纵库函数,称为标准I/O库,是ISO C的组成部分。

文件的I/O函数都是针对文件描述符进行操作的,比如说当调用open或者其他函数打开一个文件,返回一个文件的描述符fd,然后针对这个fd进行后续的I/O操作,由于需要多次反复调用对应的系统调用,效率低是自然的。

而流I/O函数的操作是围绕流(Stream)进行的,当使用流I/O库打开或者创建一个文件时,可以使一个流和一个文件结合,接下来的操作就是对流进行读写、定位等,最后关闭即可。


上图可以看出流和文件,带缓冲和不带缓冲是相对而言的。对于不带缓冲的文件I/O操作也不是直接对文件进行的,只是在用户空间没有缓冲区,所以是不带缓冲的I/O,但是对于Linux内核来说,还是进行了缓冲。当用户调用不带缓冲的IO函数写数据到文件时,即对磁盘存储区进行读写,Linux内核会先将数据写入到内核中的缓冲存储区。比如说,缓冲存储区的长度是50字节,调用write函数进行写操作时,如果每次写入10个字节,则需要调用5次write函数,而此时数据还是在内核的缓冲区中的,并没有写入到磁盘。当50个字节已经写满的时候才进行实际的IO操作,把数据写入到磁盘中。

带缓冲的IO则是在用户空间中建立了另外一个缓冲区,即流缓冲区,假设流缓冲区的长度也是50个字节,当调用对应的写入库函数时会将数据写入到这个流缓存里面,然后再一次性进入内核缓存区,此时再使用系统调用将数据写入到文件,从而减少了系统调用

总之,对于不带缓冲的I/O,将数据写入磁盘的过程是:数据→内核缓冲区→磁盘;而对于带缓冲的I/O其过程是:数据→流缓冲区→内核缓冲区→磁盘

流操作函数对象不是文件描述符,而是一个流缓冲区。当打开一个流时,返回一个指向FILE对象的指针。该对象是一个结构体,包含了管理这个流所需要的所有信息,比如说用于实际I/O的文件描述符、指向流缓存的指针、缓存的长度、当前缓存中的字符数、出错标志等。在实际的应用中,用户只需要知道为了引用一个流,需要将FILE指针作为参数传递给对应的函数即可。用户可以简单地把流看做一块由操作系统分配的内存缓冲区,在该缓冲区中存放了文件对应的数据。


  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值