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)). 当设置在文件的其他权限位上时,通常应用于目录,
表示只有文件的所有者、目录的所有者或者超级用户才能删除该目录下的文件,即使其他用户对该文件具有写权限也无法删除。

浙公网安备 33010602011771号