- 1、本文档共42页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二章设备和文件IO 本章目标 理解设备和文件的关系 理解系统调用和系统API等关系,掌握系统调用的工作过程 掌握系统调用open/read/write/fcntl等使用 Linux中的设备管理 Linux设备管理概述 在Linux系统中,用户是通过文件系统与设备接口的。所有设备都作为特别文件,从而在设备管理上具有下列特性。 (1)每个设备都对应文件系统中的一个索引节点,都有一个文件名。 (2)应用程序通常可以通过系统调用open()打开设备文件,建立起与目标设备的连接。 (3)对设备的使用类似于对文件的存取。 (4)设备驱动程序都是系统内核的一部分,它们必须为系统内核或者它们的子系统提供一个标准的接口。 (5)设备驱动程序使用一些标准的内核服务,如内存分配等。 设备工作原理 设备分类 按设备属主关系 系统设备 用户设备 按设备信息交换单位来分 字符设备 块设备 按设备共享属性来分 独享设备 共享设备 Linux设备操作 设备或文件操作两种方式: 用户编程接口 API 系统调用 系统调用 系统调用是操作系统提供给用户的一组“特殊”接口 系统调用并非直接和程序员或系统管理员直接打交道,而是通过软中断的方式向内核提交请求,从而获取内核函数的服务入口(系统调用表) 系统调用让系统从用户空间进入内核空间内运行,运行后将结果返回给应用程序(内核态-用户空间) 系统调用和系统API等区别 系统API 主要是通过C库libc来实现,程序员多采用这种方式与内核交互,这些API通过系统调用来实现 系统命令 系统管理员采用系统命令与内核交互,是一个可执行文件,通过系统API及系统调用来实现 外壳程序 一系列系统命令和SHELL脚本共同组合成的程序。 C库的文件操作 文件系统调用 open系统调用 read系统调用 write系统调用 create系统调用 close系统调用 mkdir系统调用 … 文件描述符fd 每个进程PCB结构中有文件描述符指针,指向files_struct的文件描述符表,记录每个进程打开的文件列表 系统内核不允许应用程序访问进程的文件描述符表,只返回这些结构的索引即文件描述符ID(File Description)给应用程序 Linux系统中,应用程序通过这些文件描述符来实现让内核对文件的访问 每个进程能够访问的文件描述符是有限制的,通过#ulimit –n可以查看 特殊文件描述符号 标准输入STDIN_FILENO 标准输出STDOUT_FILENO 标准错误STDERR_FILENO open系统调用2-1 有几种方法可以获得允许访问文件的文件描述符。最常用的是使用open()(打开)系统调用 函数原型 int open(const char *path, int flags); 参数 path :文件的名称,可以包含(绝对和相对)路径 flags:文件打开模式 返回值 打开成功,返回文件描述符; 打开失败,返回-1 open系统调用2-2 函数原型 int open(const char *path, int flags,mode_t mode); 参数 path :文件的名称,可以包含(绝对和相对)路径 flags:文件打开模式 mode: 用来规定对该文件的所有者,文件的用户组及系统中其他用户的访问权限,则文件权限为:mode(~umask) 返回值 打开成功,返回文件描述符; 打开失败,返回-1 打开文件的方式 访问权限 文件打开示例 #include fcntl.h #include sys/stat.h #include stdio.h void main() { int outfd = 0; outfd = open(“myfile,O_WRONLY|O_CREAT|O_TRUNC,S_IRWXU|S_IRGRP); if(outfd==-1) { perror(“fail to open file\n”); exit(-1); } else { perror(“success to open file\n”); } close(outfd); //关闭文件描述符 } 关闭文件close 将进程中fd对应的文件描述表结构释放 函数原型:int close(int fd); 函数参数: fd :要关闭的文件的文件描述符 返回值 如果出现错误,返回-1 调用成功返回0 read系统调用 一旦有了与一个打开文件描述相连的文件描述符,只要该文件是用O_RDONLY或O_RDWR标志打开的,就可以用read()系统调用从该文件中读取字节 函数原型: int read(int fd, void *buf, size_t nb
文档评论(0)