Linux打开文件函数
man open 里东西好多,终于都看了一遍.
转载请注明出处
函数原型:
参数说明:
其中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里,这三种都是同步的写入方式.
转载请注明来源:http://www.tianwaihome.com/2012/04/linux-open-file.html。