05 目录及文件_2011.ppt

  1. 1、本文档共63页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
文件和目录 大纲 文件、目录和设备 文件描述符 设备管理 大纲 文件、目录和设备 文件描述符 设备管理 Linux系统文件的属性 Linux系统提供的文件系统,是树形层次结构系统。 Linux支持多种文件系统,最常用的文件系统是ext2系统。 Linux系统的文件属性主要包括文件类型和文件权限两个方面。 Linux文件类型 Linux下最常见的文件类型有5种:普通文件、目录文件、链接文件、管道文件和设备文件。 Linux文件类型 Linux系统的主要文件类型: 文件描述符 内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。 习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2。尽管这种习惯并非 Unix 内核的特性,但是因为一些 shell 和很多应用程序都使用这种习惯,因此,如果内核不遵循这种习惯的话,很多应用程序将不能使用。 POSIX 定义了 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 来代替 0、1、2。这三个符号常量的定义位于头文件 unistd.h。 文件描述符 每个进程在进程表中都有一个记录项,每个记录项中有一张打开文件描述符表,可将视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是: ?? (a) 文件描述符标志。 ?? (b) 指向一个文件表项的指针。 (2) 内核为所有打开文件维持一张文件表。每个文件表项包含: ?? (a) 文件状态标志(读、写、增写、同步、非阻塞等)。 ?? (b) 当前文件位移量。 ?? (c) 指向该文件v节点表项的指针。 文件描述符表 ?? fd0? 0?? | p0? 文件表0 vnode0 ?? fd1? 1?? | p1? 文件表1 vnode1 ?? fd2? 2?? | p2? ?? fd3? 3?? | p3? ?? 通过dup函数来理解文件描述符 假设进程A拥有一个已打开的文件描述符fd3,它的状态如下: 进程A的文件描述符表(before dup2) ?? fd0? 0?? | p0? ?? fd1? 1?? | p1? 文件表1 vnode1 ?? fd2? 2?? | p2? ?? fd3? 3?? | p3? 文件表2 vnode2 ?? 经下面调用: n_fd = dup2(fd3, STDOUT_FILENO);后进程状态如下: 进程A的文件描述符表(after dup2) ?? fd0? 0?? | p0? ?? n_fd 1?? | p1? ?? ?????????????? \ fd2? 2?? | p2?????????????????\ ?? ???????????????? _\| fd3? 3?? | p3? 文件表2 vnode2 duptest1.c n_fd = dup2(fd3, STDOUT_FILENO)表示n_fd与fd3共享一个文件表项(它们的文件表指针指向同一个文件表项) n_fd在文件描述符表中的位置为 STDOUT_FILENO的位置,而原先的STDOUT_FILENO所指向的文件表项被关闭。 重定向后恢复 就是如何在重定向后再恢复原来的状态?首先大家都能想到要保存重定向前的文件描述符。那么如何来保存呢,象下面这样行么? int s_fd = STDOUT_FILENO; int n_fd = dup2(fd3, STDOUT_FILENO); 还是这样可以呢? int s_fd = dup(STDOUT_FILENO); int n_fd = dup2(fd3, STDOUT_FILENO); 这 两种方法的区别到底在哪呢?答案是第二种方案才是正确的,分析如下:按照第一种方法,我们仅仅在表面上保存了相当于fd_t中的index,而在调用dup2之后,ptr所指向的文件表项由于计数值已为零而被关闭了,我们如果再调用dup2(s_fd, fd3)就会出错。而第二种方法我们首先做一下复制,复制后的状态如下图所示: 进程A的文件描述符表(after dup) 进程A的文件描述符表(after dup) ?? fd0? 0?? | p0? ?? fd1? 1?? | p1? 文件表1 vnode1 ?? ???????????????? /| fd2? 2?? | p2???????????????/ ?? ???????????

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档