linux文件IO小结

虚拟文件系统(VFS):就是把各种具体的文件系统的公共部分抽取出来,形成抽象层,是系统内核的一部分。对用户程序提供了标准的文件系统调用接口,屏蔽了底层文件系统的实现细节和差异。

说白了,文件IO这种低层级的IO就是通过这些系统调用接口来进行IO操作的。

文件描述符:一个非负的整数,是一个索引值,并指向在内核中每个进程打开文件的记录表。打开或创建一个文件时,内核向进程返回一个文件描述符;读写文件时,需要把文件描述符作为参数传递给相应的函数。所有对设备和文件的操作都是通过文件描述符来进行的。

一个进程启动时,都会打开3个流:标准输入、标准输出和标准错误。对应的文件描述符分别为0、1、2(我们平时说的重定向如1>a.txt也就是对这几个标准的流进行的)

基于文件描述符的IO不能直接移植到类linux以外的操作系统上,但它是实现某些IO操作的唯一途径。

文件IO又称低级磁盘IO,遵循POSIX标准。
标准IO又称高级磁盘IO,遵循ANSI C标准。(标准C库)
linux中使用的是glibc,它是标准C库的超集,包含POSIX。所以linux下既可以使用标准IO,也可以使用文件IO。
使用文件IO可以直接读写实际文件,但是频繁的系统调用会增加系统开销。
标准IO可以看作在文件IO的基础上封装了缓冲机制。先读写缓冲区,必要时再访问实际文件,从而减少了系统调用的次数。
文件IO用文件描述符表示一个打开的文件,可以访问不同类型的文件,而标准IO用FILE(流)表示一个打开的文件,通常只用来访问普通文件。

文件IO相关函数:open()、close()、read()、write()、lseek()、fcntl()。

1、打开文件open() —>#include"sys/stat.h" #include"fcntl.h"
int open(const char *pathname,int flags,int perms);
功能:打开或创建文件,在打开或创建时可以指定文件的打开方式及文件的访问权限
参数:pathname:被打开的文件名(可包括路径名)
flags:O_RDONLY: 以只读方式打开
O_WRONLY: 以只写方式打开
O_RDWR: 以读写方式打开
O_CREAT: 如果文件不存在,就创建一个新文件,并用第三个参数为其设置权限
O_TRUNC: 若文件已存在,会删除文件中的全部原有数据,并设置文件大小为0
O_APPEND: 以添加方式打开文件,在写文件时,文件读写位置自动指向文件的末尾,即将写入的数据添加到文件的末尾
perms:新建文件的存取权限
可用一组宏定义:S_I(R/W/X)(USR/GRP/OTH)
如:S_IRUSR|S_IWUSR,它和八进制表示法中的0600等同。
返回值:成功:返回文件描述符
失败:-1
2、关闭文件close() —>#include"unistd.h"
int close(int fd);
功能:关闭一个打开的文件。当一个进程终止时,所有打开的文件都由内核自动关闭
参数:fd:文件描述符
返回值:成功:0
失败:-1
3、读取文件read() —>#include"unistd.h"
ssize_t read(int fd,void *buf,size_t count);
功能:从文件中读取数据存放到缓存区中,并返回实际读取的字节数。读操作从文件当前读写位置开始读取内容,当前读写位置自动往后移动
参数:fd:文件描述符
buf:指定存储器读出数据的缓冲区
count:指定读出的字节数
返回值:成功:读到的字节数
到达文件尾:0
出错:-1
4、读取文件write() —>#include"unistd.h"
ssize_t write(int fd,void *buf,size_t count);
功能:将数据从缓冲区写入文件中,并返回实际写入的字节数。写操作从文件当前读写位置开始写入内容,当前读写位置自动往后移动
参数:fd:文件描述符
buf:指定存储器写入数据的缓冲区
count:指定写入的字节数
返回值:成功:已写的字节数
出错:-1
5、文件定位lseek() —>#include"unistd.h" #include"sys/types.h"
off_t lseek(int fd,off_t offset,int whence);
功能:对文件当前读写位置进行定位。它只能对可定位(可随机访问)文件操作。管道、套接字和大部分字符设备文件不支持此类操作
参数:fd:文件描述符
offset:相对于基准点whence的偏移量。以字节为单位,正数表示向前移动,负数表示向后移动。
whence:当前位置的基点
SEEK_SET:文件的起始位置
SEEK_CUR:文件当前读写位置
SEEK_END:文件的结束位置
返回值:成功:文件当前读写位置
出错:-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值