Linux 文件I/O:open() 函数详解
1. 概述
open() 函数是 Linux/Unix 系统中用于创建或打开文件的核心系统调用。它返回一个文件描述符(file descriptor),后续的读写操作都通过这个描述符进行。
1.1 函数原型
c
#include <fcntl.h>
/* 打开已存在文件 */
int open(const char *pathname, int flags);
/* 创建新文件或打开文件 */
int open(const char *pathname, int flags, mode_t mode);
1.2 返回值
- 成功:返回非负整数文件描述符(通常从 3 开始,0/1/2 为标准输入/输出/错误)
- 失败 :返回 -1,并设置
errno表示具体错误
1.3 基本用法
- 打开现有文件:使用两个参数的版本
- 创建新文件:使用三个参数的版本,第三个参数指定文件权限
文件I/O -- open
函数原型
int open(const char *pathname, int flags, mode_t mode);
参数说明
-
pathname
被打开的文件名(可包括路径名)。
-
flags
- 基础读写标志(三者互斥)
- O_RDONLY:只读方式打开文件
- O_WRONLY:可写方式打开文件
- O_RDWR:读写方式打开文件
- 附加控制标志
- O_CREAT:文件不存在则新建文件,使用第三个参数设置权限
- O_EXCL:搭配O_CREAT使用,文件已存在时返回错误,可用于检测文件是否存在
- O_NOCTTY:若打开的是终端设备,该终端不作为进程控制终端
- O_TRUNC:文件已存在时,打开后清空原有全部数据
- O_APPEND:追加模式打开,所有写操作均在文件末尾执行
- mode
被打开新文件的存取权限,使用八进制数字表示。
图片文字提取
➢ umask:用来设定文件或目录的初始权限
➢ 文件和目录的真正初始权限
➢ 文件或目录的初始权限 = 文件或目录的最大默认权限 − umask
补充知识点
- 最大默认权限区分
- 普通文件:最大默认权限
0666(rw-rw-rw-),无执行权限 - 目录文件:最大默认权限
0777(rwxrwxrwx),目录必须有执行权限才能进入
- 普通文件:最大默认权限
- 计算逻辑(掩码屏蔽)
并非直接减法,是按位屏蔽:默认权限 & (~umask) - 示例
若umask为0022,新建文件:0666 & ~0022 = 0644;新建目录:0777 & ~0022 = 0755
文件I/O -- open -- 示例1
需求:以只写方式打开文件1.txt。如果文件不存在则创建,如果文件存在则清空
c
int fd;
if ((fd = open( "1.txt" , O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) {
perror( "open" );
return -1;
}
......
标志位解析
O_WRONLY:只写模式打开O_CREAT:文件不存在时新建文件,此时必须传入第三个权限参数0666O_TRUNC:文件已存在时,清空文件原有全部内容
补充说明
0666是新建文件的原始权限,最终生效权限会受系统umask掩码影响- 返回值
fd为文件描述符,小于0代表打开失败,perror("open")会打印具体错误信息