文件IO操作函数
open
需要包含的头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
原型
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
flags取值:
以下三个标志只能选择其一,不能同时选择多个
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读写打开
以下的标志可以以|位或的形式同时选择
O_APPEND 追加
O_CREAT 如果文件不存在,则创建,需要第三个参数mode指定权限
O_EXCL 配合O_CREAT可以测试文件是否存在,如果已经存在则会出错,不存在则创建
O_TRUNC 以只写或读写方式打开,文件长度会被截断为0
O_NOCTTY 指的是终端设备,该标志表示不把该设备用于控制终端
O_NONBLOCK 非阻塞的方式打开
O_SYNC 每次write写都会等待物理IO完成
mode的取值:
可以用数字表示,如0777 、0766等
可读 R 数值为4
可写W 数值为2
可执行X 数值为1
read
原型
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
write
原型
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
lseek
原型
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
whence取值:
SEEK_SET:表示文件起始位置
SEEK_CUR:表示文件当前位置
SEEK_END:表示文件末尾位置
dup/dup2
原型
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
fsync
原型
#include <unistd.h>
int fsync(int fd);//同步等待完成数据和属性的更新
int fdatasync(int fd);//只等待数据的更新完成
进程表记录项中的描述符表、文件表项、inode节点之间的关系
进程中打开文件时的内核数据结构如下图:
两个进程打开同一文件的内核数据结构如下图:
每个进程的打开的文件描述表都是独立的,从上图可以看出,不同的两个进程可以同时打开同一个文件,这两个进程会各自维护不同的文件表项,所以对于同一个文件,不同的进程可以有它自己的offset偏移量。而这两个文件表项的v节点指针指向的是同一v节点表,这个v节点表包含了真正指向文件内容数据的指针。
还有其他一些文件IO相关的知识点,后续有时间再补充记录。
THE END!