man open 里东西好多,终于都看了一遍.

转载请注明出处

函数原型:

#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);

参数说明:

其中flags必须包括以下一些参数:

O_RDONLY 只读模式打开
O_WRONLY 只写模式打开
O_RDWR 读写都可以

还可以包括以下一些参数:

O_APPEND  当加入这个标志以后,每次写入文件的时候都会从末尾写入。
O_CREAT 当文件不存在的时候创建新文件。
O_EXCL 当O_CREAT标志存在且文件存在的时候输出错误。
O_TRUNC 当文件存在且被另一个程序以可写模式打开时,把文件的长度截短为0(不明白什么意思),如果是从FIFO(先入先出)设备读取的,那么忽略这个参数。
O_NOCTTY 如果pathname是一个终端,则不将该设备分配给进程作为控制终端
O_NONBLOCK 如果可以,比如打开一个FIFO文件,以非阻塞的形式打开文件(对文件进行写入的时候不暂停进程)。

注:当O_CREAT参数有效的时候,mode参数有效,用于表示创建的文件的权限;

由mode & ~umask得到文件的最终权限;一般umask都是022。

其中mode中常用常数是:

S_IRWXU 00700 拥有者可写可读可执行
S_IRUSR 00400 拥有者可读
S_IWUSR 00200 拥有者可写
S_IXUSR 00100 拥有者可执行
S_IRWXG 00070 群组可写可读可执行
S_IRGRP 00040 群组可读
S_IWGRP 00020 群组可写
S_IXGRP 00010 群组可执行
S_IRWXO 00007 其他可写可读可执行
S_IROTH 00004 其他可读
S_IWOTH 00002 其他可写
S_IXOTH 00001 其他可执行

除了上述参数以外,flags还有以下参数(来着 man open)

O_ASYNC 当文件可读或者可写的时候发送一个信号
O_CLOEXEC 没看明白
O_DIRECT 最小化缓存的影响,尽量直接写入文件。
O_DIRECTORY 当pathname不是一个目录的时候,打开失败
O_LARGEFILE 允许文件大小超过off_t规定的大小,但是不得超过off64_t
O_NOATIME 读取文件的时候不更新最近打开时间
O_NOFOLLOW 如果pathname是一个符号链接,那么打开失败。
O_SYNC 以缓存的形式打开文件

creat 函数已经没什么用了 ,open 加上 O_CREAT|O_WRONLY|O_TRUNC三个参数就可以取代creat了。

返回值:当函数正确运行的时候,返回对应的文件描述符,当错误的时候返回-1,同时设置errno。

以下是常用的errno:

EACCES 程序无法访问文件或者权限不足
EEXIST 文件存在且O_CREAT和O_EXCL参数被选择
EFAULT pathname超出能访问的内存
EFBIG 见EOVERFLOW
EINTR 等待一个很慢的设备,或者被signal(7)打断
EISDIR 尝试对目录写入
ELOOP 符号链接太多了
EMFILE 打开文件数到达最大值
ENODEV 对应的设备不存在
ENOENT O_CREAT没被使用并且文件不存在
ENOMEM 内核内存不足
ENOSPC 设备没有多余的空间
ENXIO O_NONBLOCK | O_WRONLY被设置并且该文件是一个FIFO并且没有程序读取,或者文件是一个没有响应的设备
EOVERFLOW 文件太大
EPOFS O_NOATIME被设置,但是进程没有权限这么做
EROFS 在只读设备上尝试写入
ETXTBSY 试图写入一个正在执行的文件
EWOULDBLOCK 当O_BLOCK被设置,但是设备不兼容

附注:

附注:

O_RDONLY,O_WRONLY和O_RDWR三个参数不能共存.

在POSIX定义了三种同步方式,O_SYNC,O_DSYNC,O_RSYNC,但是在Linux里,这三种都是同步的写入方式.