• Linux _文件操作


    1. 文件的作用
      linux中,一切皆文件(网络设备除外)
      硬件设备也“是”文件,通过文件来使用设备
      目录(文件夹)也是一种文件

    2. Linux的文件结构
      了解各主要文件夹的作用

    3. 系统调用和设备驱动程序之间的关系
      应用层的open, close, read, write, ioctl与驱动程序的关系

    4. 文件操作方式
      0) 文件描述符
      是一个>=0的整数
      每打开一个文件,就创建一个文件描述符,通过文件描述符来操作文件

       预定义的文件描述符:
       0:标准输入,对应于已打开的标准输入设备(键盘)
       1:标准输出,对应于已打开的标准输出设备(控制台)
       2. 标准错误, 对应于已打开的标准错误输出设备(控制台)
      
       多次打开同一个文件,可得到多个不同的文件描述符。
      

      1) 使用底层文件操作(系统调用)
      比如:read
      可使用man 2 查看
      2) 使用I/O库函数
      比如:fread
      可使用man 3 查看

    5. 底层文件操作(关于文件的系统调用)
      1) write(int fd , char* buff ,int size_t);
      (1) 用法
      man 2 write
      (2) 返回值
      成功:返回实际写入的字节数
      失败:返回 -1
      注意:是从文件的当前指针位置写入!
      文件刚打开时,文件的位置指针指向文件头
      实例:main1.c

      2) read
      (1)用法
      man 2 read(int fd, char * buff , int size_t);
      (2)返回值

      0 : 实际读取的字节数
      0 : 已读到文件尾
      -1 :出错
      注意:参数3表示最多能接受的字节数,而不是指一定要输入的字节数
      实例:main2.c
      运行:# ./a.out /* 用户输入回车符时结束输入 */
      # ./a.out < main.c /* 利用重定向, 使用文件main.c作为输入 */

      3) open
      (1) 用法
      main 2 open
      (2) 返回值
      成功:文件描述符
      失败:-1
      (3) 打开方式
      O_RDONLY 只读
      O_WRONLY 只写
      O_RDWR 读写
      O_CREAT 如果文件不存在,则创建该文件,并使用第3个参数设置权限
      O_EXCL 如果同时使用O_CREAT而且该文件又已经存在时,则返回错误
      用途:以防止多个进程同时创建同一个文件
      O_APPEND 尾部追加方式(打开后,文件指针指向文件的末尾)
      O_TRUNC

      example:  open("/dev/hello", O_RDONLY|O_CREAT|O_EXCL, 0777)              
        (4) 参数3 (设置权限)
              当使用O_CREAT时,使用参数3
      
              S_I(R/W/X)(USR/GRP/OTH)
              例:
                    S_IRUSR | S_IWUSR    文件的所有者对该文件可读可写
                    (八进制表示法)0600            文件的所有者对该文件可读可写
      
      
      
        注意:
              返回的文件描述符是该进程未打开的最小的文件描述符
      

      4) close
      (1) 用法
      man 2 close(file_fd)

              终止指定文件描述符与对应文件之间的关联,
              并释放该文件描述符,即该文件描述符可被重新使用
      
        (2)返回值
             成功: 0
             失败: -1
      
        实例:
           使用read/write实现文件复制
           main3.c 
           main4.c
      
           观察耗时
           ./a.out
           time  ./a.out   
      
           补充:time命令
            time目录分别输出:
                 程序总的执行时间、
                 该程序本身所消耗的时间、
                 系统调用所消耗的时间 
      

      5) lseek
      (1) 用法
      man 2 lseek(file_fd , 要偏移字符数,文件指针定位 ) (文件指针是个结构体)
      (2) 返回值
      成功:返回新的文件位置与文件头之间偏移
      失败: -1

       实例:拷贝一个文件尾部的100个字节到另一个文件
       main5.c
      

      6) ioctl
      用来控制设备.
      beep实例

    6. 标准I/O库

      直接使用系统调用的缺点
      (1) 影响系统性能
      系统调用比普通函数调用开销大
      因为,系统调用要进行用户空间和内核空间的切换
      (2) 系统调用一次所能读写的数据量大小,受硬件的限制

         解决方案: 使用带缓冲功能的标准I/O库(以减少系统调用次数)
      

      /* C语言中的文件操作中已描述 */
      1) fwrite
      2) fread
      3) fopen
      4) fclose
      5) fseek
      6) fflush

    7. proc文件系统
      /proc是一个特殊的文件系统,
      该目录下文件用来表示与启动、内核相关的特殊信息

      1) /proc/cpuinfo
      CPU详细信息

      2) /proc/meminfo
      内存相关信息

      3) /proc/version
      版本信息

      4) /proc/sys/fs/file-max
      系统中能同时打开的文件总数
      可修改该文件

      5) 进程的相关信息
      /proc/32689/ 表示指定进程(进程号为32689)的相关信息

      6) /proc/devices
      已分配的字符设备、块设备的设备号

    8. 文件锁
      1) 并发对文件I/O操作的影响
      解决办法?
      2)文件锁
      用法:man 2 fcntl
      文件锁的表示
      struct flock

      详解:用法:

    include<fctntl.h>
    include<unistd.h>
    int fcntl(int fd, int cmd);
    int fcntl(int fd, int cmd, long arg);
    int fcntl(int fd, int cmd, struct flock *lock);

    参数:
    fd:文件描述词。
    cmd:操作命令。
    arg:供命令使用的参数。
    lock:同上。

    有以下操作命令可供使用

    一. F_DUPFD :复制文件描述词 。

    二. FD_CLOEXEC :设置close-on-exec标志。如果FD_CLOEXEC位是0,执行execve的过程中,文件保持打开。反之则关闭。

    三. F_GETFD :读取文件描述词标志。

    四. F_SETFD :设置文件描述词标志。

    五. F_GETFL :读取文件状态标志。

    六. F_SETFL :设置文件状态标志。
    其中O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_EXCL, O_NOCTTY 和 O_TRUNC不受影响,
    可以更改的标志有 O_APPEND,O_ASYNC, O_DIRECT, O_NOATIME 和 O_NONBLOCK。

    七. F_GETLK, F_SETLK 和 F_SETLKW :获取,释放或测试记录锁,使用到的参数是以下结构体指针:
    F_SETLK:在指定的字节范围获取锁(F_RDLCK, F_WRLCK)或者释放锁(F_UNLCK)。如果与另一个进程的锁操作发生冲突,返回 -1并将errno设置为EACCES或EAGAIN。
    为了设置读锁,文件必须以读的方式打开。为了设置写锁,文件必须以写的方式打开。为了设置读写锁,文件必须以读写的方式打开。

    struct flock 的设置:
    struct flock flock;
    flock.l_type = type; 文件锁 的类型 读锁 写锁
    flock.l_whence = SEEK_SET; 定位
    flock.l_start = 0; 偏移量
    flock.l_len = 0; 读取长度
    flock.l_pid = -1; 文件描述符

    设置文件锁时 可以封装为一个函数 int flock_set(int fd, int type);
    文件锁的操作 int fcntl(int fd, int cmd , struct flock *lock); cmd 获取 释放 测试

    2)实例
     main6.c
    
  • 相关阅读:
    ABBYY Cup 3.0G3. Good Substrings
    Codeforces Beta Round #94 (Div. 1 Only)B. String sam
    hdu5421Victor and String 两端加点的pam
    loj#2059. 「TJOI / HEOI2016」字符串 sam+线段树合并+倍增
    Codeforces Round #349 (Div. 1)E. Forensic Examination
    ACM-ICPC World Finals 2019 G.First of Her Name
    51nod1647 小Z的trie
    LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci 题解
    POJ 2443 Set Operation 题解
    CSP-J 2019游记
  • 原文地址:https://www.cnblogs.com/Sico2Sico/p/5384225.html
Copyright © 2020-2023  润新知