open函数详解

说明:本文主要是对man 帮助文档和《linux程序设计》第四版的摘录,部分理解来源于个人,请酌情参考。

学习了write和read,再理解open也很简单。

Open

open:创建文件描述符,所关联的文件可以是直接打来,也可以是创建并打开。
简单来说:open建立了一条道文件或者设备的访问路径。如果调用成功,它将返回一个可以被read和write等其他系统调用使用的文件描述符。这个文件描述符是唯一的。它不会与任何其他运行中的进程共享,除非是fork了子进程。如果两个进程同时打开一个文件,他们会分别得到两个不同的文件描述符。如果他们都对文件进行写操作,那么他们会各写各的,它们分别接着自己上次离开的位置继续往下写,数据不会交织在一起,而是会彼此覆盖。我们可以使用文件锁功能来防止这种事件。

概要:

1
2
3
4
5
6
#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);

说明:

准备打开的文件或者设备的名字作为参数path传递给函数。

oflags参数用于指定打开文件所采取的动作。

mode:表示穿创建文件的模式。

oflags
oflags参数是通过必需文件访问模式与其他可选模式相结合的方式来指定的。
必需文件访问模式:

必需文件访问模式 说明
O_RDONLY 以只读的方式打开
O_WRONLY 以只写的方式打开
O_RDWR 以读写的方式打开

可选模式:(用“按位或”的方式与必需模式结合)(列表不全)

可选文件访问模式 说明
O_APPEND 把写入的文件追加的文件末尾,即指示符指向末尾。
O_TRUNC 把文件的长度设置成0,丢弃已有的内容
O_CREAT 如果需要,就按照参数mode中给出的模式创建文件。
O_EXCL 与O_CREAT一起使用,可以防止两个程序同时创建同一个文件。如果文件存在,open调用会失败。

返回值

调用成功返回一个新的描述符,它是一个非负整数,通常是还没有使用的最小的数。

失败时候返回-1,并使用全局变量errno来保存错误码。

默认状态下,打开文件的时候,偏移量指向文件的开头。可以使用O_CLOEXEC改变。

Create

create并不常用,这个调用不仅会像我们预期的那样创建文件,还会打开文件。他的作用相当于:

oflags=O_CREAT|O_WRONLY|O_TRUNC。

任何一个运行中的程序能够打开的文件数是有限制的。这个限制通常是由limits.h头文件中的常量OPEN_MAX定义的,它的值随系统的不同而不同。通常不小于16。这个限制可以在系统运行时调整,所以OPEN_MAX 并不是一个常量,他通常一开始被设置成256。

错误码

EACCES:对文件的请求访问谁不允许的,或者是不可搜索的,或者是上一目录不接访问。
EEXIST :文件已经存在,并且使用了O_CREAT和O_EXCL
EFAULT :文件路径是可访问的地址空间之外。
EFBIG :同 EOVERFLOW。
EINTR :打开的过程中阻塞。
EISDIR :路径名是一个文件夹,并且oflags设置中有写操作。(O_WRONLY 或O_RDWR)
ELOOP:路径名有太多的符号链接。(或者是O_NOFOLLOW )
EMFILE
ENAMETOOLONG
ENFILE
ENODEV
ENXIO
ENOENT O_CREAT
ENOMEM Insufficient kernel memory was available.
ENOSPC
ENOTDIR
ENXIO
EOVERFLOW
EPERM
EROFS
ETXTBSY
EWOULDBLOCK

注意

建议

测试代码