• [03]APUE:文件 I/O


    [a] open

    #include <fcntl.h>
    int open(const char *path,  int oflag, ... ,mode_t mode) 
    • 成功返回文件描术符, 失败返回 -1
    • oflag: O_RDONLY / O_WRONLY / O_RDWR / O_EXEC / O_APPEND / O_CLOEXEC / O_CREAT / O_EXCL / O_NONBLOCK / O_NOFOLLOW / O_SYNC / O_TRUNC / O_DSYNC ...
    • mode: 创建文件时賦予的初始权限, 可用数字表示, 如 0644 等

    [b] creat

    #include <fcntl.h>
    int creat(const char *path, mode_t mode)
    • 等效于 open(path, O_RDWR|O_CREAT|O_TRUNC, mode)

    [c] close

    #include <unistd.h>
    int close(int fd) 
    • 成功返回 0, 出錯返回 -1

    [d] lseek

    #include <unistd.h>
    off_t lseek(int fd, off_t offset, int whence) 
    • 成功返回新的文件偏移量,出錯返回 -1
    • offset: 以字节为单位的偏移量
    • whence: SEEK_CUR / SEEK_SET / SEEK_END
    • lseek 中的 l 是历史遗留问题, 指 long int
    • lseek(fd, 0, SEEK_CUR) 常用于确定已打开文件的当前偏移量
    • 偏移量超过文件末尾写数据, 会生成空洞, 空洞不占用磁盘空间

    [e] read

    #include <unistd.h>
    ssize_t read(int fd, void *buf, size_t nbytes) 
    • 成功返回读到的字节数量, 若已到达文件末尾, 则返回 0, 出錯返回 -1
    • 尝试从 fd 中读取 nbytes 个字节到 buf 中, 有多种情况可使读到的字节数小于 nbytes

    [f] write

    #include <unistd.h>
    ssize_t write(int fd, const void *buf, size_t nbytes) 
    • 成功返回写入的字节数量, 出錯返回 -1
    • 若写入字节数与 nbytes 不同, 则表示出錯
    • 读写效率: 通常 buf 设为 PAGESIZE 或其整数倍时拥有最高的效率

    [g] pread / pwrite

    #include <unistd.h>
    ssize_t pread(int fd, void *buf, size_t nbytes, off_t offset)
    ssize_t pwrite(int fd, const void *buf, size_t nbytes, off_t offset) 
    • 返回值情况与 read / write 相同
    • 读写操作与定位文件偏移量是一个原子操作(atomic operation)
    • 不更新 SEEK_CUR 的值

    [h] dup / dup2

    #include <unistd.h>
    int dup(int fd)
    int dup2(int fd, int fd2) 
    • 成功返回文件描述符, 出錯返回 -1
    • dup 返回的 fd 一定是当前可用 fd 中的最小值
    • 对于 dup2, 若 fd2 已经打开且不等于 fd, 将先关闭之, 再重新打开
    • 两个函数均会清除新打开的 fd 的 FD_CLOEXEC 标志

    [i] sync / fsync / fdatasync

    #include <unistd.h>
    int fsync(int fd)
    int fdatasync(int fd)
    void sync(void) 
    • 对于 fsync / fdatasync, 成功返回0, 出錯返回 -1
    • sync 只是将所有修改过的块緩冲排入写队列, 然后立即返回, 并不等待实际磁盘操作結束
    • fdatasync 只更新数据, 不更新文件属性, FreeBSD 不支持 fdatasync

    [j] fcntl

    #include <fcntl.h>
    int fcntl(int fd, int cmd, ..., int arg) 
    • 成功返回值因 cmd 而异, 出錯返回 -1
    • 共有 5 种功能:
      • 复制文件描述符, cmd=F_DUPFD / F_DUPFD_CLOEXEC, 成功返回新的文件描述符
      • 获取或设置文件描述符标志, cmd=F_GETFD / F_SETFD, 成功返回相应 fd flag, 通常以 1 或 0 表示 FD_CLOEXEC 标志位的启用与否
      • 获取或设置文件状态标志, cmd=F_GETFL / F_SETFL, 成功返回相应 file flag
      • 获取或设置异步 I/O 所有权, cmd=F_GETOWN / F_SETOWN, 成功时返数一个整数, 正数表示进程 ID, 負数表示进程組 ID
      • 获取或设置记录锁, cmd=F_GETLK / F_SETLK / F_SETLKW
    • F_GETFL 可用的标志有: O_RDONLY / O_WRONLY / O_RDWR / O_EXEC / O_APPEND / O_NONBLOCK / O_SYNC / O_DSYNC / O_ASYNC, 前 4 个标志的判断需要用现有的文件状态标志与 O_ACCMODE 进行 '&' 操作, 将結果与对应标志逐一比較, 其它标志可直接与对应标志进行 '&' 操作判断
    • F_SETFL 操作会清空原有的所有文件状态标志, 通常先用 F_GETFL 获取原有的值, 然后取新的标志与原有值 '|' 操作之后的結果, Linux 不允许在已打开的文件上更改 O_SYNC 标志

    ....

  • 相关阅读:
    【GoLand】分享项目到Github平台
    【Git】实用教程
    【Go】Mac系统下安装GoLand 及 环境配置
    CF 901C Bipartite Segments
    CF 811E Vladik and Entertaining Flags
    Luogu P6300 悔改
    Luogu P3943 星空
    CSP2020 | T4
    NOIP2017 | D2T3
    Luogu P6852 Mex
  • 原文地址:https://www.cnblogs.com/hadex/p/6128412.html
Copyright © 2020-2023  润新知