- 1、本文档共63页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)