文件I/O打开使用

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

参数说明

  1. pathname

    被打开的文件名(可包括路径名)。

  2. flags

  • 基础读写标志(三者互斥)
    • O_RDONLY:只读方式打开文件
    • O_WRONLY:可写方式打开文件
    • O_RDWR:读写方式打开文件
  • 附加控制标志
    • O_CREAT:文件不存在则新建文件,使用第三个参数设置权限
    • O_EXCL:搭配O_CREAT使用,文件已存在时返回错误,可用于检测文件是否存在
    • O_NOCTTY:若打开的是终端设备,该终端不作为进程控制终端
    • O_TRUNC:文件已存在时,打开后清空原有全部数据
    • O_APPEND:追加模式打开,所有写操作均在文件末尾执行
  1. mode
    被打开新文件的存取权限,使用八进制数字表示。

图片文字提取

➢ umask:用来设定文件或目录的初始权限

➢ 文件和目录的真正初始权限

➢ 文件或目录的初始权限 = 文件或目录的最大默认权限 − umask


补充知识点

  1. 最大默认权限区分
    • 普通文件:最大默认权限 0666(rw-rw-rw-),无执行权限
    • 目录文件:最大默认权限 0777(rwxrwxrwx),目录必须有执行权限才能进入
  2. 计算逻辑(掩码屏蔽)
    并非直接减法,是按位屏蔽:默认权限 & (~umask)
  3. 示例
    若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;
}
......

标志位解析

  1. O_WRONLY:只写模式打开
  2. O_CREAT:文件不存在时新建文件,此时必须传入第三个权限参数0666
  3. O_TRUNC:文件已存在时,清空文件原有全部内容

补充说明

  • 0666是新建文件的原始权限,最终生效权限会受系统umask掩码影响
  • 返回值fd为文件描述符,小于0代表打开失败,perror("open")会打印具体错误信息