linux设备文件,Linux文件和设备文件初步

本文介绍了Linux下的文件操作系统调用及文件操作方法,包括创建、打开、读写和关闭文件的常用函数。同时,还深入探讨了字符设备与块设备的文件操作,以及2.4和2.6内核中devfs和udev设备文件系统的实现原理。

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

Linux下的文件操作

系统调用,对文件操作,相当于Win下面的API

涉及文件的创建、打开、读写和关闭文件

常用 函数

创建:

int creat(const char *filename, mode_t mode)

mode是读写权限

mode&umask

int umask(newmask);//修改函数

打开:

int open(const char *pathname, int flags);

int open(const char *pathname,int flags, mode_t mode);

flags为读写权限和访问权限

读写:

int read(int fd, const void *buf, size_t length);

int write(int fd, cosnt void *buf, size_t length);

定位:

int lseek(int fd, offset_t offset, int whence);

常用

lseek(fd, 0, SEEK_END);//返回文件的长度

C函数的文件操作

C函数库的操作实际是独立于具体的平台,不论是DOS,WIN,Vxwoks,Linux都是这些函数

创建和打开:

FILE *fopen(const char *path, const char *mode);

实际是创建文件后以后面的mode指定打开的模式

读写:

C函数库支持以字符、字符串为单位,支持按照某种格式进行文字的读写,

int fgetc(FILE *stream);

int fputc(int c, FILE *stream);

char *fgets(char *s, int n, FILE *stream);

int fputs(const char *s,   FILE *stream);

int printf(FILE *stream, const char *format,...);

int fscanf(FILE *stream, const char *foramt,...);

size_t fread(void *ptr, size_t size, size_t n, FILE *stream);

C库函数的读写中的定位函数

int fgetpos(FILE *stream, fpos_t *pos);

int fsetpos(FILE *stream, const fpos_t *pos);

int fseek(FILE *stream, long offset, int whence);

关闭

int fclose(FILE *stream);

文件系统

应用程序和VFS之间的接口是系统调用,而VFS与磁盘文件系统以及普通设备接口之间的接口

file_operatinons结构体成员函数,它包含了对文件的打开关、关闭、读写、控制等一系列

成员函数

字符设备上面没有磁盘文件系统,主要操作函数就由file_operations提供了,file_operations

正是字符设备的核心

而比如块设备文件的操作由VFS来提供,

而在设备驱动中,需要关注以下两个结构体(待完善)

file结构体

代表一个打开的文件,由内核在打开文件的时候创建,并传递给在文件上进行操作的任何函数

inode结构体

包含文件访问的权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息,是Linux

文件系统的最基本单位,也是文件系统连接任何子文件目录、文件的桥梁

说明:

对于表示设备文件的inode结构体,i_rdev字段包含设备编号,2.6内核中,主设备号是dev_t

的高12位,次设备号为dev_t的低20位

devfs和udev设备文件系统

devfs是2.4内核的

优点:

1,在设备初始化的时候在/dev进行创建,卸载时候删除

2,驱动程序可以指定设备名,所有者,权限位,用户空间可以修改所有者的权限位

3,不用指定主设备号和次设备号,而是由register_chrdev()传递0设备号来动态的分配主设备号

并在devfs_register()中指定次设备号

创建设备目录函数

devfs_handle_t devfs_mk_dir(devfs_handle_t dir, const char *name, void *info);

创建设备文件函数

devfs_handle_t devfs_register(devfs_handle_t dir, const char *name, unsigned

int flags, unsigned int major, unsigned int minor, umode_t mode, void *ops, void *info);

撤消设备文件函数

void devfs_unregister(devfs_handle_t de);

2.4的设备编程中,分别在模块加载和卸载函数中创建和撤消设备文件是很常见的

udev是2.6内核的(有待于进一步的理解)

知识点:

1,udev完全在用户态工作,(包括设备命名策略,权限控制和事件处理)利用设备的加入或移除时内核所发送的热挺拔事件来工作

2,设备的详细信息会由内核输出到位于/sys下的sysfs文件系统

3,udev根据系统中的硬件的设备的状态动态更新设备文件的状态,/dev目录下只包含系统真正存在的设备

4,udev是在发现设备时加载驱动,而devfs是在设备访问时个加载驱动

另外,理解以下内容:(2.6内核驱动核心架构)

1,sysfs文件系统

2,kobject内核对象

3,kset内核对象集合

4,subsystem内核对象子系统

5,Linux设备模型组件:device结构体

6,属性

7,udev的组成

8,udev规则文件

9,创建和配置udev

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值