Linux文件IO编程学习笔记
文件的基本操作
int fd;
d = open (filename,flags,mode);
write (fd, buf, write_len);
sync ();
fsync (fd);
lseek (fd, 0, SEEK_SET);
read (fd, buf, read_len);
close (fd);
文件的打开open
int open (const char *pathname, int flags);
int open (const char *pathname, int flags, mode_t mode);
执行成功时:
返回一个文件描述符
将文件的读写位置偏移设置为0
根据flags标志位给出的模式打开文件
执行失败时
返回-1
设置errno
主参数
只读模式:O_RDONLY
只写模式:O_WRONLY
读写模式:O_RDWR
副参数
O_CREAT:当文件不存在时创建该文件,文件存在时该位无效
O_EXCL:与O_CREAT组合使用,当文件存在时,open调用失败,防止创建文件时出现竞争。
O_DIRECT:直接I/O
O_SYNC:同步I/O
O_ASYNC:用于终端或套接字、指定文件读写时产生一个信号
O_APPEND:追加模式
O_NOFOLLOW:若文件是一个软链接,则open调用失败
O_NOBLOCK:非阻塞模式打开
O_TRUNC:若文件存在,将文件长度截断为0,(FIFO、终端设备无效)
Create:O_WRONLY|O_CREAT|O_TRUNC组合封装
文件的关闭close
int close (int fd);
成功:返回0
失败:返回-1,并设置errno
TIPS
文件关闭并不意味该文件的数据已经被写到磁盘
一个进程运行结束,会自动关系其打开的文件描述符
显式关闭文件、尤其是对于对大量文件进行读写的后台程序
文件的创建
int open(const char *pathname, int flags, mode_t mode);
创建文件要指定文件的权限,默认为未定义
文件的读写权限
创建文件:open
int open (const char *pathname, int flags);
int open (const char *pathname, int flags, mode_t mode);
所有者 群组 其它人
R W X R W X R W X
读: 4
写: 2
执行:1
未定义: 0/-
修改读写权限
$ chmod o+w hello.c
$ chmod a-x hello.c
+:增加权限
- :删除权限
=:重新赋值,使之成为唯一的权限
u:所有者
g:所有者所在群主(group)
o:其他人(others)
a:所有人
系统调用
int chmod (const char *pathname, mode_t mode);
int fchmod (int fd, mode_t mode);
pathname:可以是文件名、硬链接、软链接
mode:新设置的权限为,可以是8进制,也可以是掩码形式
– 0777、0666
– S_IRUSR | S_IWUSR | S_IRGRP
– S_IRUSR:用户读权限 (Permits the file’s owner to read it)
– S_IWUSR:用户写权限 (Permits the file’s owner to write to it)
– S_IXUSR:用户执行权限 (Permits the file’s owner to execute it)
– S_IRGRP:用户组读权限 (Permits the file’s group to read it)
– S_IWGRP:用户组写权限 (Permits the file’s group to write to it)
– S_IROTH:其他组读权限 (Permits others to read it)
– S_IWOTH:其他组写权限 (Permits others to write to it)
问题
使用open打开并创建一个新文件,打开模式mode参数设置为0777。
创建出来的文件权限为-rwxr-xr-x。
进程会使用umask命令屏蔽用户组和其他用户的写权限,可能是为了安全起见。
文件的读写函数
基本函数
ssize_t read (int fd, void *buf, size_t count);
从fd指向的文件读取count个字节数据到缓冲区buf中
读取成功:返回读取数据的长度、移动文件位置指针
读取失败:返回-1,并设置errno值
ssize_t write (int fd, const void *buf, size_t count);
将缓冲区buf中的数据写入fd指向的文件中
写入成功:返回写入的字节数,并更新文件位置指针
写入失败:返回-1,并设置errno值
写入零个字节:返回0
read函数解析
read的返回值
ssize_t read (int fd, void *buf, size_t count);
返回值为count:成功读取count个字节
返回值为(0,count)
文件位置指针到了文件末尾
读取的文件长度小于count
系统调用被信号打断
管道可能被破坏
返回值为0:文件位置指针到了文件末尾(EOF)
返回值为-1:读写错误,并设置errno值
write函数调用
write函数调用成功,数据不一定写到磁盘上
void sync (void);
int syncfs (int fd);
文件读写位置与定位
改变文件位置指针
成功的read
成功的write
主动的lseek
改变文件偏移量
lseek函数
off_t lseek( int fd, off_t offset, int whence);
参数offset:可以为正、可以为负、可以为0
参数whence
SEEK_SET:文件开头
SEEK_CUR:文件当前偏移位置
SEEK_END:文件尾部
文件空洞
文件结束标志EOF
文件存储数据最后一个字节的下一个位置
当文件指针到了EOF,继续读写,会发生怎么情况?
read:返回 0
write:可以在任意位置写
文件空洞:从文件结尾到新写入数据之间的空间
TIPS
字符设备、Socket、终端设备等流式设备不支持lseek
管道、FIFO不支持lseek
获取文件的属性信息
文件数据的存储
纯数据:存储在data block中
元数据:存储在inode table中
文件名:存储在目录文件的目录项中
元数据
文件时间戳
文件权限
文件所有权
文件存储地址
链接数
标签:文件,int,编程,read,fd,mode,IO,Linux,权限
来源: https://blog.csdn.net/m0_38139533/article/details/115408793