Open系统调用

open(2) - Linux manual page (man7.org)

open

Standard C library (libc, -lc)
int open(const char *pathname, int flags, ...  /* mode_t mode */ );

功能: open() 系统调用打开由 pathname 指定的文档。 如果指定的文档不存在,可能由open() 创建  (如果O_CREAT在 flags 中指定)。

返回:文件描述符(非负整数,打开文件表的一个条目) 记录了文件的状态与偏移

A file descriptor is a reference to an open file description;

 

flags 必须包含以下访问模式之一  modes: O_RDONLY, O_WRONLY, or O_RDWR.  只读,只写,读写

另外,零个或多个文档创建标志和文档状态 。标志可以在标志中按位或。

文档创建标志是

O_CLOEXEC、O_CREAT、O_DIRECTORY、

O_EXCL、O_NOCTTY、O_NOFOLLOW、

O_TMPFILE,O_TRUNC。

file status flags 文件状态标志

 

文件创建标志影响打开操作本身的语义,而文件状态标志影响后续 I/O 操作的语义。

https://man7.org/linux/man-pages/man2/fcntl.2.html

部分标志位/include/uapi/asm-generic/fcntl.h

 

  • O_ACCMODE:用于从文件的访问模式中提取有效位。
  • O_RDONLY:以只读模式打开文件。
  • O_WRONLY:以只写模式打开文件。
  • O_RDWR:以读写模式打开文件。
  • O_CREAT:如果文件不存在,则创建文件。
  • O_EXCL:与O_CREAT一起使用,如果文件已经存在,则返回错误。
  • O_NOCTTY:如果文件是终端设备,不将其作为控制终端。
  • O_TRUNC:如果文件已经存在,将其截断为空文件。
  • O_APPEND:在文件末尾追加数据。
  • O_NONBLOCK:以非阻塞模式打开文件。
  • O_DSYNC:等待物理I/O操作完成后再返回。
  • FASYNC:启用异步通知(信号)机制。
  • O_DIRECT:绕过内核缓冲区以进行直接I/O。
  • O_LARGEFILE:允许处理大文件,超过2GB。
  • O_DIRECTORY:要求路径是一个目录。
  • O_NOFOLLOW:如果路径是符号链接,则不跟踪符号链接。
  • O_NOATIME:不更新访问时间。
  • O_CLOEXEC:在执行exec时关闭文件描述符。
  • O_SYNC:同步所有I/O操作。
  • O_PATH:仅用于获取文件描述符,而不是执行任何读写操作。
    •   当在 flags 中指定 O_PATH 时,除了 O_CLOEXEC、O_DIRECTORY 和 O_NOFOLLOW 之外的标志位会被忽略。
  • O_TMPFILE:创建一个不具名的临时文件。

 

mode 参数指定文档模式位 ,创建新文档时应用。如果flags没有 O_CREAT 也没有指定 O_TMPFILE,则忽略模式 (因此可以指定为 0,或简单地省略)。

如果 O_CREAT 或 O_TMPFILE在flags中被指定,则必须提供模式 mode参数。如果没有提供,一些任意的堆栈中的字节将用作文档模式。

一些mode,在create时可用

             S_IRWXU  00700 user (file owner) has read, write, and
                       execute permission

              S_IRUSR  00400 user has read permission

              S_IWUSR  00200 user has write permission

              S_IXUSR  00100 user has execute permission

              S_IRWXG  00070 group has read, write, and execute
                       permission

              S_IRGRP  00040 group has read permission

              S_IWGRP  00020 group has write permission

              S_IXGRP  00010 group has execute permission

              S_IRWXO  00007 others have read, write, and execute
                       permission

              S_IROTH  00004 others have read permission

              S_IWOTH  00002 others have write permission

              S_IXOTH  00001 others have execute permission

              According to POSIX, the effect when other bits are set in
              mode is unspecified.  On Linux, the following bits are
              also honored in mode:

              S_ISUID  0004000 set-user-ID bit 当设置在文件的用户权限位上时,表示在执行该文件时,将暂时将进程的有效用户ID更改为文件的所有者的用户ID。

              S_ISGID  0002000 set-group-ID bit (see inode(7)). 当设置在文件的组权限位上时,表示在执行该文件时,将暂时将进程的有效组ID更改为文件的所属组的组ID。

              S_ISVTX  0001000 sticky bit (see inode(7)). 当设置在文件的其他权限位上时,通常应用于目录,
                                表示只有文件的所有者、目录的所有者或者超级用户才能删除该目录下的文件,即使其他用户对该文件具有写权限也无法删除。

 

posted @ 2024-04-08 11:26  zzl14  阅读(135)  评论(0)    收藏  举报