文件IO(open函数)

本文详细介绍了open函数的功能及使用场景,并列举了不同类型的文件创建接口及其用途,包括普通文件、目录、套接字、命名管道、字符设备、链接等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

open函数可以打开各类不同的文件(除了套接字和目录),但只能创建普通文件。

 

拓展:

创建以下文件所使用的接口:

-: 用open()创建,用open()打开

d: 用mkdir()创建,用opendir()打开

s: 用socket()创建并打开

p: 用fifo()创建,用open()打开

b: 用mknod()创建,用open()打开

c: 用mkmod()创建,用open()打开

l: 用link()创建,用open()打开

### ### IoOpen 函数的底层实现原理 在 Linux 系统中,并没有直接名为 `IoOpen` 的系统调用或标准函数。通常,用户可能指的是 `open` 系统调用,它是用于打开或创建文件并返回文件描述符的核心接口。`open` 是在 `<fcntl.h>` 头文件中声明的系统调用,其底层实现依赖于 Linux 内核对文件操作的支持机制。 当调用 `open` 函数时,内核会执行以下操作: - 检查文件是否存在,并根据传入的标志(如 `O_CREAT`)决定是否创建新文件; - 验证进程对文件的访问权限; - 分配一个新的文件描述符(file descriptor, 简称 fd),该描述符指向内核中的 `file` 结构体; - 返回该文件描述符,供后续的 `read`、`write`、`lseek` 等操作使用[^5]。 文件描述符是一个非负整数,通常从 0 开始分配。标准输入、标准输出和标准错误分别对应 0、1、2 这三个默认的文件描述符。新打开的文件描述符总是当前进程中最小的未被使用的整数[^5]。 ### ### IoOpen 使用方法及示例 尽管 `IoOpen` 并非标准函数,但可以将其理解为 `open` 函数的等价形式。`open` 的函数原型如下: ```c int open(const char *pathname, int flags, ... /* mode_t mode */ ); ``` 其中: - `pathname`:要打开或创建的文件路径; - `flags`:控制文件的打开方式,如 `O_RDONLY`(只读)、`O_WRONLY`(只写)、`O_RDWR`(读写)等; - `mode`:可选参数,用于指定新文件的权限位(仅在使用 `O_CREAT` 标志时有效)。 #### 示例 1:以只读方式打开一个现有文件 ```c #include <fcntl.h> #include <unistd.h> #include <stdio.h> int main() { int fd = open("example.txt", O_RDONLY); if (fd == -1) { perror("Open failed"); return 1; } printf("File opened with fd: %d\n", fd); close(fd); return 0; } ``` #### 示例 2:创建一个新文件并写入内容 ```c #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <string.h> int main() { int fd = open("newfile.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664); if (fd == -1) { perror("Open failed"); return 1; } const char *msg = "Hello, world!\n"; write(fd, msg, strlen(msg)); close(fd); return 0; } ``` 在上述代码中,`O_WRONLY` 表示以只写方式打开文件,`O_CREAT` 表示如果文件不存在则创建,`O_TRUNC` 表示如果文件已存在则清空内容。权限位 `0664` 表示所有者和组有读写权限,其他用户只有读权限。 ### ### 与标准 I/O 的区别 `open` 属于低层系统调用,直接操作文件描述符,不提供缓冲功能;而标准 I/O 库(如 `fopen`)则提供了缓冲机制,提升了 I/O 效率。`fopen` 是对 `open` 的封装,属于用户级函数,其操作对象是 `FILE*` 指针,而非文件描述符[^5]。 此外,`open` 支持一些高级标志,如 `O_APPEND`(追加写)、`O_NONBLOCK`(非阻塞模式)等,这些功能在标准 I/O 中可能需要通过额外函数调用实现。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

干燥剂007860

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值