文件与目录操作
# 文件与目录操作
# LINUX文件系统
- Linux中一切皆为文件,这样保证了操作的一致性
- Linux文件系统是根目录结构,而Windows文件系统是多根目录结构
虚拟文件系统VFS
super block
超级块:对一个文件系统的描述inode
索引节点:对一个文件物理属性的描述dentry
目录现对象:对一个文件逻辑属性的描述file
文件对象:保存文件位置的文件描述
# LINUX文件IO操作
系统调用
Linux包含的系统调用包含在
libc
库中调用实现:系统命令 >> API >> 系统调用
Linux文件IO操作函数:
- open() : 打开或者创建文件
- create() : 打开一个文件,若不存在则创建文件
- close() : 关闭文件
- read() : 读文件内容
- write() : 写文件
文件IO是直接IO效率高于有缓存的标准IO
标准IO库
- fopen() : 打开一个文件
- setbuf() / setvbuf() :打开和关闭缓冲机制
- fdopen() : 常用于创建管道及网络通信通道函数返回的描述符
- fclose() : 关闭一个文件
# LINUX文件定位与共享
文件定位
lseek() : 常用于找文件开头或文件末端,判定文件描述符的当前位置(仅仅将但其那文件的偏移量记录在内核中),将文件指针推进到末端之后的位置,并用0填充形成空洞,可以提高系统性能。
2.3.1.c
//lseek实现空洞 int main(int argc, char const *argv[]) { int fd; int ret; fd = open("hello.txt",O_WRONLY|O_CREAT|O_TRUNC,0644); if(fd == -1) R_EXIT("open error"); write(fd,"hello",5); ret = lseek(fd,1024*1024*1024,SEEK_CUR); if(ret == -1) ERR_EXIT("lseek error"); write(fd,"world",5); close(fd); return 0; } /* *./2.3.1 *ls -lh hello.txt *du -h hello.txt //文件大小 *od -c hello.txt //文件ASCII码 *cat hello.txt //只显示hello而不显示world因为他们在不同的存储空间 */
pread() : 根据给定的偏移量读取一个文件描述符。由于lseek和read调用之间,内核可能会临时挂起进程,影响进程同步,调用pread相当于顺序调用lseek和read,作为一个原子操作。
pwrite() : 根据给定的偏移量写入一个文件描述符。由于lseek和write调用之间,内核可能会临时挂起进程,影响进程同步,调用pread相当于顺序调用lseek和write,作为一个原子操作。(可避免竞争条件)
文件共享
不同进程共享文件实现
- 文件描述符表:存在与进程表中,每个表项指向一个文件表
- 文件表:包含文件的状态标志、文件当前位置、指向该文件索引节点表的指针
- 索引节点表:包含文件的类型属性和文件数据,每个文件仅仅对应唯一的索引节点表
dup() 和 dup2() 函数实现文件共享:通过复制文件的描述符,使得在同一个进程中描述符指向相同的文件表
线程共享文件:CLONE_VS CLONE_FS CLONE_FILES CLONE_SIGHAND
上次更新: 2023/11/19, 12:55:48