《linux设备驱动开发详解》-it培训学习资料库

上传人:ldj****22 文档编号:37667465 上传时间:2018-04-20 格式:PDF 页数:31 大小:750.51KB
返回 下载 相关 举报
《linux设备驱动开发详解》-it培训学习资料库_第1页
第1页 / 共31页
《linux设备驱动开发详解》-it培训学习资料库_第2页
第2页 / 共31页
《linux设备驱动开发详解》-it培训学习资料库_第3页
第3页 / 共31页
《linux设备驱动开发详解》-it培训学习资料库_第4页
第4页 / 共31页
《linux设备驱动开发详解》-it培训学习资料库_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《《linux设备驱动开发详解》-it培训学习资料库》由会员分享,可在线阅读,更多相关《《linux设备驱动开发详解》-it培训学习资料库(31页珍藏版)》请在金锄头文库上搜索。

1、 LINUX 设备驱动开发详解 作者:华清远见 第第 5 章章 Linux 文件系统与设备文件系统文件系统与设备文件系统 本章简介 由于字符设备和块设备都很好地体现了“一切都是文件”的设计思想,掌握 Linux 文件系统、设备文件系统的知识非常重要。 首先,设备驱动最终通过操作系统的文件系统调用或 C 库函数(本质也基于系 统调用)被访问。 其次, 驱动工程师在设备驱动中不可避免地会与设备文件系统打交道, 如 Linux 2.4 内核的 devfs 文件系统和 Linux 2.6 内核的基于 sysfs 的 udev 文件系统。 5.1节讲解了通过Linux API和C库函数在用户空间进行Li

2、nux文件操作的编程 方法。 5.2 节分析了 Linux 文件系统的目录结构, 简单介绍了 Linux 内核中文件系统的 实现,并给出了文件系统与设备驱动的关系。 5.3 节和 5.4 节分别讲解 Linux 2.4 内核的 devfs 和 Linux 2.6 内核所采用的 udev 设备文件系统,并分析了两者的区别。 专业始于专注 卓识源于远见 2 Linux 文件操作文件操作 5.1.1 文件操作的相关系统调用文件操作的相关系统调用 Linux 的文件操作系统调用(在 Windows 编程领域,习惯称操作系统提供的接口为 API)涉及创建、 打开、读写和关闭文件。 1创建创建 int c

3、reat(const char *filename, mode_t mode); 参数mode指定新建文件的存取权限, 它同umask一起决定文件的最终权限 (mode 该调用将 umask 设置为 newmask,然后返回旧的 umask,它只影响读、写和执行权限。 2打开打开 int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); open()函数有两个形式,其中 pathname 是我们要打开的文件名(包含路径名称,默认时认为在当前路 径下面) ,

4、flags 可以是如表 5.1 所示的一个值或者是几个值的组合。 表 5.1 文件打开标志 标 志 含 义 O_RDONLY 以只读的方式打开文件 O_WRONLY 以只写的方式打开文件 O_RDWR 以读写的方式打开文件 O_APPEND 以追加的方式打开文件 O_CREAT 创建一个文件 O_EXEC 如果使用了 O_CREAT 而且文件已经存在,就会发 生一个错误 O_NOBLOCK 以非阻塞的方式打开一个文件 O_TRUNC 如果文件已经存在,则删除文件的内容 O_RDONLY、O_WRONLY、O_RDWR 这 3 个标志只能使用任意的一个。 如果使用了O_CREATE 标志, 则使

5、用的函数是int open(const char *pathname,int flags,mode_t mode) ; 这个时 候我们还要指定mode 标志,用来表示文件的访问权限。mode 可以是如表5.2 所示值的组合。 表 5.2 文件访问权限 标 志 含 义 S_IRUSR 用户可以读 S_IWUSR 用户可以写 S_IXUSR 用户可以执行 专业始于专注 卓识源于远见 3 续表 标 志 含 义 S_IRWXU 用户可以读、写、执行 S_IRGRP 组可以读 S_IWGRP 组可以写 S_IXGRP 组可以执行 S_IRWXG 组可以读、写、执行 S_IROTH 其他人可以读 S_IW

6、OTH 其他人可以写 S_IXOTH 其他人可以执行 S_IRWXO 其他人可以读、写、执行 S_ISUID 设置用户的执行 ID S_ISGID 设置组的执行 ID 除了可以通过上述宏进行“或”逻辑产生标志以外,我们也可以自己用数字来表示,Linux 总共用 5 个数字来表示文件的各种权限:第一位表示设置用户 ID;第二位表示设置组 ID;第三位表示用户自己的 权限位;第四位表示组的权限;第五位表示其他人的权限。每个数字可以取 1(执行权限) 、2(写权限) 、 4(读权限) 、0(无)或者是这些值的和。 例如,如果要创建一个用户可读、可写、可执行,但是组没有权限,其他人可以读、可以执行的文

7、件, 并设置用户 ID 位。那么,应该使用的模式是 1(设置用户 ID) 、0(不设置组 ID) 、7(1+2+4,读、写、 执行) 、0(没有权限) 、5(1+4,读、执行)即 10705,如下所示: open(“test“, O_CREAT, 10705); 上述语句等价于: open(“test“, O_CREAT, S_IRWXU | S_IROTH | S_IXOTH | S_ISUID ); 如果文件打开成功,open 函数会返回一个文件描述符,以后对该文件的所有操作就可以通过对这个文 件描述符进行操作来实现。 3读写读写 在文件打开以后,我们才可对文件进行读写,Linux 系统中

8、提供文件读写的系统调用是 read、write 函 数,如下所示: int read(int fd, const void *buf, size_t length); int write(int fd, const void *buf, size_t length); 其中参数 buf 为指向缓冲区的指针,length 为缓冲区的大小(以字节为单位) 。函数 read()实现从文件 描述符 fd 所指定的文件中读取 length 个字节到 buf 所指向的缓冲区中,返回值为实际读取的字节数。函数 write 实现将把 length 个字节从 buf 指向的缓冲区中写到文件描述符 fd 所指向的

9、文件中,返回值为实际写 入的字节数。 以O_CREAT 为标志的open 函数实际上实现了文件创建的功能,因此,下面的函数等同creat()函数: int open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode); 4定位定位 对于随机文件,我们可以随机地指定位置读写,使用如下函数进行定位: int lseek(int fd, offset_t offset, int whence); 专业始于专注 卓识源于远见 4 lseek()将文件读写指针相对 whence 移动 offset 个字节。操作成功时,返回文件指针相对于文件头的位 置。参数 whe

10、nce 可以使用如下值。 SEEK_SET:相对文件开头。 SEEK_CUR:相对文件读写指针的当前位置。 SEEK_END:相对文件末尾。 offset 可取负值,例如下述调用可将文件指针相对当前位置向前移动 5 个字节。 lseek(fd, -5, SEEK_CUR); 由于lseek 函数的返回值为文件指针相对于文件头的位置, 因此下列调用的返回值就是文件的长度: lseek(fd, 0, SEEK_END); 5关闭关闭 当操作完成以后,就要关闭文件了,只要调用 close 函数就可以了,其中 fd 是要关闭的文件描述符。 int close(int fd); 例程:编写一个程序,在当

11、前目录下创建用户可读写文件“hello.txt” ,在其中写入“Hello, software weekly” ,关闭该文件。再次打开该文件,读取其中的内容并输出在屏幕上,如代码清单 5.1 所示。 代码清单 5.1 Linux 文件操作用户空间编程(使用系统调用) 1 #include 2 #include 3 #include 4 #include 5 #define LENGTH 100 6 main() 7 8 int fd, len; 9 char strLENGTH; 10 11 fd = open(“hello.txt“, O_CREAT | O_RDWR, S_IRUSR |

12、S_IWUSR); /* 12 创建并打开文件 */ 13 if (fd) 14 15 write(fd, “Hello World“, strlen(“Hello World“); /*写入字符串 */ 16 17 close(fd); 18 19 20 fd = open(“hello.txt“, O_RDWR); 21 len = read(fd, str, LENGTH); /* 读取文件内容 */ 22 strlen = 0; 23 printf(“%sn“, str); 24 close(fd); 25 编译并运行,执行结果为输出“Hello World” 。 专业始于专注 卓识源

13、于远见 5 5.1.2 C 库函数的文件操作库函数的文件操作 C 库函数的文件操作实际上是独立于具体的操作系统平台的,不管是在 DOS、Windows、Linux 还是 在 VxWorks 中都是这些函数。 1创建和打开创建和打开 FILE *fopen(const char *path, const char *mode); fopen()实现打开指定文件 filename,其中的 mode 为打开模式,C 库函数中支持的打开模式如表 5.3 所 示。 表 5.3 C 库函数文件打开标志 标 志 含 义 r、rb 以只读方式打开 w、wb 以只写方式打开。如果文件不存在,则创建该文件,否则文

14、件 被截断 a、ab 以追加方式打开。如果文件不存在,则创建该文件 r+、r+b、rb+ 以读写方式打开 w+、w+b、wh+ 以读写方式打开。如果文件不存在,则创建新文件,否则文件 被截断 a+、a+b、ab+ 以读和追加方式打开。如果文件不存在,则创建新文件 其中 b 用于区分二进制文件和文本文件,这一点在 DOS、Windows 系统中是有区分的,但 Linux 系统 不区分二进制文件和文本文件。 2读写读写 C 库函数支持以字符、字符串等为单位,支持按照某种格式进行文件的读写,这一组函数为: int fgetc(FILE *stream); int fputc(int c, FILE

15、*stream); char *fgets(char *s, int n, FILE *stream); int fputs(const char *s, FILE *stream); int fprintf(FILE *stream, const char *format, .); int fscanf (FILE *stream, const char *format, .); size_t fread(void *ptr, size_t size, size_t n, FILE *stream); size_t fwrite (const void *ptr, size_t size,

16、size_t n, FILE *stream); fread()实现从 stream 中读取 n 个字段,每个字段为 size 个字节,并将读取的字段放入 ptr 所指的字符 数组中,返回实际已读取的字段数。在读取的字段数小于 num 时,可能是在函数调用时出现错误,也可能 是读到文件的结尾。所以要通过调用 feof()和 ferror()来判断。 write()实现从缓冲区 ptr 所指的数组中把 n 个字段写到 stream 中,每个字段长为 size 个字节,返回实 际写入的字段数。 另外,C 库函数还提供了读写过程中的定位能力,这些函数包括: int fgetpos(FILE *stream, fpos_t *pos); int fsetpos(FILE

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号