Skip to content

Latest commit

 

History

History
351 lines (197 loc) · 11.3 KB

文件的访问之 系统调用.md

File metadata and controls

351 lines (197 loc) · 11.3 KB

「 文件的访问之 系统调用 」


  说明: 基于 POSIX(Portable Operating System Interface) 标准,采用 C 语言,实现了为应用程序提供与操作系统内核通信的服务的API。

💬 open 系统调用

  • 系统调用名:open

  • 头文件:unistd.h

  • 功能:打开 path 所指的文件

  • 函数定义:

    • int open(const char *path, int oflags)

    • int open(const char *path, int oflags, mode_t mode)

  • 其中:

    • path: 文件所在路径

    • oflags: 设置 open 文件操作类型

    • mode: 设置 open 文件模式

    • 返回值: 打开成功,返回一个唯一的文件描述符;不成功,返回 -1,并设置相应的 errno 变量以指明出错的原因

💬 close 系统调用

  • 系统调用名:close

  • 头文件:unistd.h

  • 功能:将与 fildes 文件描述符相关联的文件断开

  • 函数定义:

    • int close(int fildes)
  • 其中:

    • fildes: 文件描述符

    • 返回值: 关闭成功,返回 0;不成功,返回 -1

💬 write 系统调用

  • 系统调用名:write

  • 头文件:unistd.h

  • 功能:将 buff 中的前 nbytes 个字节的数据写入到与 fildes 相关联的文件描述符中

  • 函数定义:

    • *size_t write(int fildes, const void buff, size_t nbytes)
  • 其中:

    • fildes: 文件描述符

    • buff: 数据的来源

    • nbytes: 数据的长度(以字节为单位)

    • 返回值: 写入成功,返回值的范围为 0~nbytes;不成功,返回 -1,对应错误代码保存在全局变量 errno 中

💬 read 系统调用

  • 系统调用名:read

  • 头文件:unistd.h

  • 功能:将与 fildes 文件描述符相关联的文件的前 nbytes 个字节的数据读入到 buff 中

  • 函数定义:

    • *size_t read(int fildes, const void buff, size_t nbytes)
  • 其中:

    • fildes: 文件描述符

    • buff: 数据的来源

    • nbytes: 数据的长度(以字节为单位)

    • 返回值: 读取成功,返回值的范围为 0~nbytes;不成功,返回 -1,对应错误代码保存在全局变量 errno 中

💬 fcntl 系统调用

  • 系统调用名:fcntl

  • 头文件:fcntl.h

  • 功能:修改某个文件描述符的特性

  • 函数定义:

    • int fcntl(int fildes, int cmd)

    • int fcntl(int fildes, int cmd, long arg)

    • int fcntl(int fildes, int cmd, struct flock *lock)

  • 其中:

    • fildes: 需要修改属性的文件描述符

    • cmd: 将要操作的指令,其中指令如下

      • F_DUPFD 用来查找大于或等于参数 arg 的最小且仍未使用的文件描述符,并且复制参数 fildes 的文件描述符。执行成功则返回新复制的文件描述符。新描述符与 fildes 共享同一文件表项,但是新描述符有它自己的一套文件描述符标志,其中 FD_CLOEXEC 文件描述符标志被清除。

      • F_GETFD 取得 close-on-exec 旗标。若此旗标的 FD_CLOEXEC 位为 0,代表在调用 exec() 相关函数时文件将不会关闭。

      • F_SETFD 设置 close-on-exec 旗标。该旗标以参数 arg 的 FD_CLOEXEC 位决定。

      • F_GETFL 取得文件描述符状态旗标,此旗标为 open() 的参数 flags。

      • F_SETFL 设置文件描述符状态旗标,参数 arg 为新旗标,但只允许 O_APPEND、O_NONBLOCK 和 O_ASYNC 位的改变,其他位的改变将不受影响。

      • F_GETLK 取得文件锁定的状态。

      • F_SETLK 设置文件锁定的状态。此时 flock 结构的 l_type 值必须是 F_RDLCK、F_WRLCK 或 F_UNLCK。如果无法建立锁定,则返回 -1,错误代码为 EACCES 或 EAGAIN。

      • F_SETLKW F_SETLK 作用相同,但是无法建立锁定时,此调用会一直等到锁定动作成功为止。若在等待锁定的过程中被信号中断,会立即返回 -1,错误代码为 EINTR。

    • lock: flock 结构指针定义如下

      struct flock
      {
          short int l_type;
          short int l_whence;
          off_t l_start;
          off_t l_len;
          pid_t l_pid;
      };
      • l_type 有三种状态:F_RDLCK 建立一个供读取用的锁定、F_WRLCK 建立一个供写入用的锁定、F_UNLCK 删除之前建立的锁定。

      • l_whence 也有三种方式:SEEK_SET 以文件开头为锁定的起始位置、SEEK_CUR 以目前文件读写位置为锁定的起始位置、SEEK_END 以文件结尾为锁定的起始位置。

      • l_start 表示相对 l_whence 位置的偏移量,两者一起确定锁定区域的开始位置。

      • l_len 表示锁定区域的长度,如果为 0 表示从起点(由 l_whence 和 l_start 决定的开始位置)开始直到最大可能偏移量为止。即不管在后面增加多少数据都在锁的范围内。

    • 返回值: 返回成功,依赖于 cmd 的值;不成功,返回 -1,错误原因存于 errno 中

💬 lseek 系统调用

  • 系统调用名:lseek

  • 头文件:unistd.h

  • 功能:设置与文件描述符 fildes 相关的文件或设备的读写指针位置

  • 函数定义:

    • size_t lseek(int fildes, off_t offset, int whence)
  • 其中:

    • fildes: 文件描述符

    • offset: 设置的参照位置

    • whence: 相对于参照位置的偏移量

    • 返回值: 成功,返回值为从文件头到设置的位置的偏移量(以字节为单位);不成功,返回 -1

💬 *stat 系统调用

  • 系统调用名:fstat / stat / lstat

  • 头文件:

  • 功能:获取文件的相关状态信息

  • 函数定义:

    • int fstat(int fildes, struct stat *buff)

    • int stat(const char *path, struct stat *buff)

    • int lstat(const char *path, struct stat *buff)

  • 其中:

    • fildes: 文件描述符

    • path: 文件的路径

    • buff: 结构体 struct stat 的大小,buff 结构指针定义如下

      struct stat
      {
          dev_t st_dev;           /* 文件所在设备的标识 */
          ino_t st_ino;           /* 文件结点号 */
          mode_t st_mode;         /* 文件保护模式 */
          nlink_t st_nlink;       /* 硬连接数 */
          uid_t st_uid;           /* 文件用户标识 */
          gid_t st_gid;           /* 文件用户组标识 */
          dev_t st_rdev;          /* 文件所表示的特殊设备文件的设备标识 */
          off_t st_size;          /* 总大小,单位为字节 */
          blksize_t st_blksize;   /* 文件系统的块大小 */
          blkcnt_t st_blocks;     /* 分配给文件的块的数量,512 字节为单位 */
          time_t st_atime;        /* 最后访问时间 */
          time_t st_mtime;        /* 最后修改时间 */
          time_t st_ctime;        /* 最后状态改变时间 */
      };
    • 返回值: 成功,返回 0;不成功,返回 -1,错误原因存于 errno 中

💬 mmap 系统调用

  • 系统调用名:mmap

  • 头文件:sys/mman.h

  • 功能:将虚拟地址映射到物理地址,或者映射到文件和文件位置

  • 函数定义:

    • void* mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t offset)
  • 其中:

    • addr: 内存起始地址

    • len: 内存分配长度

    • prot: 设置内存段访问权限

    • flags: 控制程序对该段内存的访问方式,在调用 mmap() 时必须要指定 MAP_SHARED 或 MAP_PRIVATE 其一

      • MAP_SHARED 对映射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享。

      • MAP_PRIVATE 对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回原来的文件内容。

      • MAP_FIXED 如果参数 start 所指的地址无法成功建立映射时,则放弃映射,不对地址做修正。通常不鼓励用此旗标。

      • MAP_ANONYMOUS 建立匿名映射。此时会忽略参数 fildes,不涉及文件,而且映射区域无法和其他进程共享。

      • MAP_DENYWRITE 只允许对映射区域的写入操作,其他对文件直接写入的操作将会被拒绝。

      • MAP_LOCKED 将映射区域锁定住,这表示该区域不会被置换(swap)。

    • fildes: 文件描述符

    • offset: 设置的参照位置

    • whence: 相对于参照位置的偏移量

    • 返回值: 返回值为最后文件映射到进程空间的地址,进程可直接操作起始地址为该值的有效地址。

💬 munmap 系统调用

  • 系统调用名:munmap

  • 头文件:sys/mman.h

  • 功能:释放内存段

  • 函数定义:

    • int munmap(void *addr, size_t len)
  • 其中:

    • addr: 内存起始地址

    • len: 内存分配长度

    • 返回值: 如果解除映射成功则返回 0,否则返回 -1,错误原因存于 errno 中

- End -