王清欢Randy 王清欢Randy
首页
  • 编程语言

    • C/C++ 学习笔记
    • Golang 学习笔记
  • 算法分析

    • LeetCode 刷题笔记
  • 操作系统

    • Linux 基础
    • Vim 实用技巧
    • Shell 脚本编程
    • GDB 学习笔记
  • 开发工具

    • Git 学习笔记
  • 分布式理论

    • 共识算法
    • 分布式事务
  • 数据库内核

    • PostgreSQL
    • Postgres-XL
  • hidb
  • pgproxy
  • 实用技巧
  • 学习方法
  • 资源分享
GitHub (opens new window)
首页
  • 编程语言

    • C/C++ 学习笔记
    • Golang 学习笔记
  • 算法分析

    • LeetCode 刷题笔记
  • 操作系统

    • Linux 基础
    • Vim 实用技巧
    • Shell 脚本编程
    • GDB 学习笔记
  • 开发工具

    • Git 学习笔记
  • 分布式理论

    • 共识算法
    • 分布式事务
  • 数据库内核

    • PostgreSQL
    • Postgres-XL
  • hidb
  • pgproxy
  • 实用技巧
  • 学习方法
  • 资源分享
GitHub (opens new window)
  • Linux 基础

    • 基本Linux命令
    • 文件与目录操作
      • 文件与目录操作
        • LINUX文件系统
        • LINUX文件IO操作
        • LINUX文件定位与共享
    • 进程与线程
    • 线程同步与进程通信
    • Linux 文件权限
    • Linux 命令行快捷键
  • Vim 实用技巧

    • Vim常用技巧
    • Vim解决问题的方式
    • Vim普通模式
    • Vim插入模式
    • Vim可视模式
    • Vim命令行模式
  • Shell 脚本编程

    • 目录
  • GDB学习笔记

    • GDB基础调试
    • GDB调试Coredump
  • Linux操作系统编程
  • Linux 基础
王清欢
2023-04-30
目录

文件与目录操作

# 文件与目录操作

# 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
基本Linux命令
进程与线程

← 基本Linux命令 进程与线程→

Theme by Vdoing | Copyright © 2023-2024 Wang Qinghuan | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式