本文基于Linux 4.2.0内核手册。
open function用于打开一个文件并返回文件描述符。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
Return: file descriptor if OK
-1 on ERROR
flags有三个选项:
flags | |
---|---|
O_RDONLY | 只读 |
O_WRONLY | 只写 |
O_RDWR | 可读可写 |
如上三个选项是必备的,如下的常量是可选的:
optional flags | |
---|---|
O_APPEND | 每次write 操作在文件尾追加内容 |
O_CREAT | 如果文件不存在,创建新文件,该选项需要第三个参数mode ,mode指定了新文件的访问权限 |
O_EXCL | 当O_CREAT 也被制定并且文件已经存在了,则会产生错误。该选项用于确保本次调用创建文件。 |
O_TRUNC | 仅当文件存在,文件成功打开,并且权限为只写或者读写,会将其长度截断为0 |
O_NOCTTY | 如果打开的是终端设备(terminal device),则不会将该设备作为该进程的控制终端(controlling terminal) |
O_NONBLOCK or O_NDELAY | If the pathname refers to a FIFO, a block special file, or a character special file,该选项会设置打开的文件和后续的IO操作为无阻塞的模式。O_NDELAY与O_NONBLOCK功能一样,建议新的代码都不要使用O_NDELAY |
O_ASYNC | Enable signal-driven I/O: generate a signal (SIGIO by default, but this can be changed via fcntl(2)) when input or output becomes possible on this file descriptor. This feature is available only for terminals, pseudoterminals, sockets, and (since Linux 2.6) pipes and FIFOs. See fcntl(2) for further details. See also BUGS, below. |
O_DSYNC | 该选项影响文件的属性,仅仅在文件数据改变并且需要更新这些属性的时候。 |
O_SYNC | 每次写入文件的时候都会更新文件的时间 |
O_CLOEXEC | |
O_DIRECT | |
O_DIRECTORY | |
O_LARGEFILE | |
O_NOATIME | |
O_NOFOLLOW | |
O_PATH | |
O_TMPFILE |
通过open返回的文件描述符,会使用没有使用的最小整数。利用这种特性,你可以关闭某个标准输出-例如标准输出 1,然后打开一个新的文件,那么该文件的描述符就是1。这样就等于在标准输入、输出、错误之上打开了一个新文件。我们有更好的办法在给定的描述符上打开文件,dup2函数具有该功能。
Filename and Pathnamer Trunction
NAME_MAX
表明文件名的最大长度,PATH_MAX
为路径名的最大长度。Linux中会直接报错,不会进行截断文件名。errno
会被设置为ENAMETOOLONG
creat
creat相当于open使用了flags(O_CREAT|O_WRONLY|O_TRUNC),且creat打开的文件是只写的,如果你需要read,则需要先close文件,再用open打开。因此建议直接使用open,而不再使用creat。