一、open 函数原型与核心认知
int open(const char *pathname, int flags, mode_t mode);
很多新手最大误区:误以为 mode 是文件固定权限、flags 可以随意填写。
实际内核执行逻辑非常严格,两个参数分工完全不同。
核心规则:
- flags:控制本次打开文件的行为、权限诉求,决定程序能对文件做什么操作
- mode:仅新建文件时生效,打开已有文件时完全无效,不会修改旧文件权限
二、flags 参数两大核心分类
flags 支持通过 | 按位或叠加组合,分为「访问权限标志」和「行为控制标志」两类。
1. 访问权限标志(三选一、必选)
该类标志作用:向内核声明本次打开文件的操作诉求,仅做权限校验,绝对不会修改磁盘文件权限。
- o_rdonly:只读打开,仅允许读取文件内容
- o_wronly:只写打开,仅允许修改文件内容
- o_rdwr:读写打开,同时支持读、写文件
内核硬性逻辑:程序申请的权限,必须和磁盘文件真实权限匹配,权限不足则 open 直接返回 -1 打开失败。
2. 行为控制标志(可选、可叠加)
(1)o_creat:不存在则创建文件
文件不存在:自动创建文件,此时 mode 参数、umask 掩码生效,共同决定文件初始权限
文件已存在:o_creat 完全失效,mode 参数直接作废,不会修改原有文件的任何权限
(2)o_trunc:截短清空文件内容
linux 重点考点,该标志不能单独使用、不能随意使用,有严格生效前提:
- 目标文件必须已存在,且是普通文件(管道、设备文件等特殊文件行为未定义)
- 必须搭配 o_wronly / o_rdwr(带写权限模式),禁止搭配只读 o_rdonly
- 磁盘文件自身必须拥有写权限,否则截断失败、文件打开报错
功能:将文件长度置 0,清空所有原有内容。
关键特性:仅清空文件数据,完全不修改文件权限。
(3)o_append:文件追加模式
每次执行 write 写入操作前,自动将文件偏移量跳转至文件末尾,实现内容追加,不会覆盖原有文件数据。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论