Linux驱动开发之Open_Close函数

引言

在Linux字符设备驱动开发中, open 与 close函数是用户空间与内核空间交互的第一道门户。作为文件操作接口 file_operations 的核心成员,它们负责设备的初始化访问、资源分配与释放,是实现设备独占控制、引用计数管理以及驱动状态维护的关键机制。深入理解这对函数的协作原理,是掌握Linux驱动开发的必经之路。

在 Linux 里, open 和 close 是最基础的文件I/O系统调用,用来打开/关闭文件、设备、管道、socket 等一切"文件"。

Open函数

首先,Open函数需要用到三个核心的头文件,如下:

cs 复制代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

sys/types.h主要是定义系统用到的基本类型,没有它,编译会报错类型不认识。sys/stat.h主要是定义文件状态,权限等相关的宏。fcntl.h是最最重要的,因为它定义了Open函数本身以及所有的Flag。

函数原型
cs 复制代码
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

可以看到,这两个函数都是含参数且有返回值的函数。它们是同一个系统调用,只是参数略有不同。

参数const char *pathnam

表示要打开的/创建的文件路径,可以是相对路径,也可以是绝对路径。

参数int flags

表示打开方式,通常用位或组合表示。

必选三选一:

O_RDONLY 只读

​ O_WRONLY 只写

​ O_RDWR 读写

常用可选:

O_CREAT 文件不存在就创建 ​

O_TRUNC 打开时清空文件 ​

O_APPEND 追加写 ​

O_EXCL 与 O_CREAT 一起用,文件已存在则报错 ​

O_NONBLOCK 非阻塞打开

参数mode_t mode

注意,这个是只有在带有O_CREAT时才需要。表示新疆文件的权限,只有在创建文件时才生效。且是8进制数,以0开头。

返回值

因为返回类型是int,所以只有两种情况:

1,成功

会返回一个非负整数,叫文件描述符(fd)。一般从3开始往上分配,因为0,1,2已经被标准输入,输出,错误占用。

2,失败

固定返回-1。不管出现什么错误,返回的都是-1。

Close函数

所需要的头文件:

cs 复制代码
#include <unistd.h>

这个头文件的作用是提供Linux系统中最基础的系统调用函数。

函数原型
cs 复制代码
int close(int fd);

可以看到,该函数只有一个参数,且只有一个返回值。

参数int fd

必须是open函数成功返回的文件描述符。不能随便填数字

返回值

成功返回0,失败返回-1。

使用示例

如图:

解释一下,这里是主要验证的是open,close函数的使用,主要是以只读的形式打开a.txt文件。如果打开成功,则返回相应的文件描述符(fd)。如果失败则返回-1。当然,我这里也有一个Bug,那就是如果打开失败的话就会返回-1给文件描述符fd,那这样的话下面的close函数也会使用的-1的文件描述符,这样可能会出现报错。所以说我这个是在理想的情况下输出的结果,也就是当a.txt文件存在的时候。注意,如果用户仅仅是打开某个文件而不关闭的话,这在一定程度上会占用系统资源,造成不必要的浪费。所以这两个函数一个放在一起使用。

总结

本文仅仅是个人观点,如有不足,欢迎指出!

相关推荐
坤坤子吖11 分钟前
Linux 线程同步与互斥——条件变量与线程同步
linux·开发语言·c++·笔记·学习
flytalei14 分钟前
从 Jenkins 到 Argo CD:搭建一条完整的 GitOps 实战链路
运维·jenkins
张文君28 分钟前
vmware克隆后ubuntu26.04 ip怎么更改
linux·运维·服务器
迪康coolmu40 分钟前
基于迪康端点安全一体化管理系统的 AI 工具使用审计实战
运维·网络·人工智能·安全·电脑
2402_882893861 小时前
Linux进程控制(上):fork、写时拷贝、进程终止与进程等待,一篇吃透!
linux·进程·fork·写时拷贝
笨笨饿1 小时前
144_Codex变慢的解决办法
stm32·单片机·嵌入式硬件·mcu·物联网·51单片机·proteus
小此方1 小时前
Linux网络(二十九):从内网穿透到P2P打洞:NAT转换、代理机制与局域网通信的底层全景解析
linux·网络·p2p
Brilliantwxx1 小时前
【Linux】基础IO(下):输出重定向、dup2 与 minishell 重定向实战
linux·运维·服务器·github·bash
学linux的QQ蛋1 小时前
IMX6 嵌入式多传感器系统整体架构梳理
linux·嵌入式硬件·架构
小HANN2 小时前
(架构 + InnoDB 事务 MVCC):《MySQL 底层探秘①:拆解 InnoDB,读懂事务、MVCC 与日志的底层逻辑》
linux·运维·服务器·经验分享