我是靠谱客的博主 幸福帽子,最近开发中收集的这篇文章主要介绍Linux 非缓冲I/O与缓冲I/O,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在linux系统中,文件的I/O分为两种类型,第一种类型是非缓冲式文件操作,主要是由系统调用提供,另一种是缓冲式I/O操作,主要是由C语言的标准输入输出库函数提供。这里学习一下非缓冲式文件I/O操作,下面简称I/O.

非缓冲的文件I/O

非缓冲式文件操作适用于小规模文件的读写,或者是实时设备,执行非缓冲式文件操作,应用程序能够立即得到数据。非缓冲式文件操作的函数主要是由系统调用提供。操作系统内核利用文件描述符来访问文件;文件标识符是一个非负整数,系统预留了3个文件标识符:

  • 0 代表标准输入,即通过键盘输入
  • 1 代表标准输出,即输出到终端
  • 2 标准错误,系统中存放错误信息的堆栈

文件的读写与访问

1、open

int open(path,flag,mode);打开一个文件
函数的基本结构,path为文件路径,flag为一些参数,当文件是新建时mode用来指定文件访问属性;

flag常用值:O_RDONLY ; O_WRONLY ; O_RDWR ; 分别为只读,只写,读写方式
mode常用值: S_IRWXU ; S_IRWXG ; S_IRWXO ;分别代表用户,组,其他的读写执行权限;

2、creat

int creat(path,modo);创建一个文件,只写方式
参数与open相同;
相当于:open(path,O_WRONLY | O_CREAT | O_TRUNC, mode);

3、close

int close(int fd);关闭一个文件,成功返回0,失败-1
fd为文件描述符;

4、lseek

off_t lseek(int fd, off_t offset, int whence); 返回文件偏移量

5、read

ssize_t read(int fd, void *buf, size_t count); 读文件
count为需要读取的字节数,返回读到的字节数

6、write

ssize_t write(int fd, void *buf, size_t count); 写文件
count为需要写入的字节数,返回已写的字节数

7、chmod,fchmod

int chmod(filename,mode);
int fchmod(fd,mode)
改变文件访问权限,成功返回0,失败-1,区别在于前一个通过文件名访问,后一个通过文件描述符;

8、chown,fchown,lchown

int chown(filename,newowner,newgroup);
int fchown(fd,newowner,newgroup);
int lchown(filename,newowner,newgroup);
改变文件所有者,区别在于第一个利用文件名,第二个为打开的文件(文件描述符),第三个针对链接文件

9、rename

int rename(oldname,newname);
文件重命名,成功返回0,失败-1

sys/types.h :定义了某些与实现相关的数据类型,被称为基本系统数据类型

dup/dup2

int dup(fd);
int duo2(fd, fd2); 复制文件描述符

缓冲I/O

缓冲I/O:就是在内存中开辟了一块缓冲区,对文件的操作先存在了缓冲区,在“需要”的时候在写到磁盘。一般来说,缓冲区越大,进行实际I/O就越少,效率越高。I/O标准库提供的函数为缓冲I/O:fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek等。

区别:
非缓冲I/O,每次对于文件的操作,都要进行I/O操作,优点是能迅速把内容写到文件中。缺点就是频繁进行I/O操作,非常消耗CPU。
fopen系列函数是标准库提供的,使用的是文件结构体指针,把文件当做流来处理。open系列函数是系统条用,使用的是文件描述符。
在Linux一切皆文件,但是fopen操作的只是指普通文件。设备文件不能当做流式文件来处理的,只能使用open系列函数。
fopen使进程在用户态下就有了缓冲区,不像open系列函数,每次都要进行系统条用,用户态/内核态切换。

最后

以上就是幸福帽子为你收集整理的Linux 非缓冲I/O与缓冲I/O的全部内容,希望文章能够帮你解决Linux 非缓冲I/O与缓冲I/O所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部