UNX环境高级编程第三章课后习题解析.pdf_第1页
UNX环境高级编程第三章课后习题解析.pdf_第2页
UNX环境高级编程第三章课后习题解析.pdf_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

UNX 环境高级编程第三章课后习题解析环境高级编程第三章课后习题解析 3 1 当读当读 写磁盘文件时 本章中描述的函数是否有缓冲机制 请说明原因 写磁盘文件时 本章中描述的函数是否有缓冲机制 请说明原因 解析 解析 本章中的函数应该是特指 read write 这两个系统调用 这两个函数由于是系 统调用 因此这两个函数都是在内核中进行 所以称之为不带缓冲的 I O 函数 而带有缓冲的函数本质上是依赖一段额外的内存空间作为临时缓冲区 这样做可 以避免一些不当的设置导致读写性能较低的问题 例如标准 I O 函数中的 gets 等函数大致就是这样的 很显然 系统调用 read 和 write 并没有借助这样的技术 3 2 编写一个与编写一个与 3 12 节中节中 dup2 功能相同的函数 要求不调用功能相同的函数 要求不调用 fcntl 函数 并且函数 并且 要有正确的出错处理 要有正确的出错处理 解析 解析 既然不能够使用 fcntl 函数 那么我们实现只能考虑使用 dup 函数 当然这个 实现方式相对来说非常的暴力 首先我们关闭指定的新描述符 之后我们开始暴 力的调用 dup 函数 直到 dup 函数返回值与指定的新描述符值相同为止 在这个 过程中我们要通过一个线性的结构来记录中间所有被 dup 调用打开的描述符 这 些描述符的打开并不是我们预期的 随后我们必须逐个关闭这些描述符 否则不 但会额外占用大量的系统资源 导致进程无法打开新的文件 还导致了通过其它 描述符也可以对文件进行访问 所以它们必须被关闭 至于错误处理问题 我们就需要关心一下 errno 这个东西了 如果仅仅从 errno 入手的话 我们没有必要在一开始就检查这个指定的新描述符值是否小于系统中 的限制值 只需关心它是否为非负数就可以了 在之后的不断调用 dup 函数的过 程中 如果如果 dup 函数出现错误就直接返回 1 就是了 这里也会包括无法在打 开更多描述符的问题 在忽视其他进程也调用类似函数的情况下这说明我们指定 的新描述符值相对来说太大了 至于 errno 值就不必关心了 这个值仅仅在函数 出现错误的时候可能会用到 而且不会在任何库函数调用前被重置 因此 当我 们自己编写的函数出错返回时 errno 值会被保留 我们可以大概知道是在哪一 步出现了错误 这里我们或许可以借助 sysconf 函数来获取系统对一个进程打开最大描述符 的限制 使用 sysconf 函数获取相关限制是一个很好的编程习惯 这使得代码具 有更好的移植性 详细内容请参考 UNIX 环境高级编程 第 2 5 节 在最后我们需要补充一点 那就是当原始描述符与新指定的描述符值相同的 情况 如果此时直接将新指定的描述符关闭的话 那么恐怕就要出现问题了 很 显然这和我们的预期并不相符 3 3 假设一个进程执行下面的假设一个进程执行下面的 3 个函数调用 个函数调用 fd1 open pathname oflags fd2 dup fd1 fd3 open pathname oflags 画出类似于图画出类似于图 3 3 的结果图 对的结果图 对 fcntl 作用于作用于 fd1 来说 来说 F SETFD 命令会影命令会影 响到哪个文件描述符 响到哪个文件描述符 F SETFL 呢 呢 解析 解析 这道题的关键之一就是画出结果图 这一点非常重要 只要图画出来了一切 都好解释了 首先 fd2 描述符是由 fd1 描述符直接通过 dup 函数复制而来 那么 我们可以看到这两个描述符其实是共享同一个文件表的 而 fd3 则是通过 open 函数与 fd1 打开了同一个文件 不过这两个描述符是不可能共享一个文件表的 只不过由于打开的是同一个文件 那么二者的文件表中 v 节点指针的指向是相同 的 了解这些之后结果图很容易就可以画出来了 接下来我们要明确的是文件表中都有些什么 根据 UNIX 环境高级编程 的讲解 文件表中一共有三项 文件状态标志 当前文件变量和 v 节点指针 这 一点至关重要 如果不明确这点就很难得出最终的正确结论 除此之外 了解 fcntl 函数中指定 F SETFD 和 F SETFL 的作用也同样重要 F SETFD 作用是修改文 件描述符标志的作用 这个是仅仅对当前文件描述符起作用的 所以受影响的描 述符仅有 fd1 而对于 F SETFL 而言 是修改这个文件描述符打开文件的状态标 志 这个状态标志指的无非就是 O RDONLY 之类的 详见 open 函数论述 我 们发现这个部分居然在文件表中存储 那么我们可以断定与 fd1 共享一个文件表 的文件描述符都将会受到影响 所以此时受影响的文件描述符为 fd1 和 fd2 3 4 在许多程序中都包含下面一段代码 在许多程序中都包含下面一段代码 dup2 fd 0 dup2 fd 1 dup2 fd 2 if fd 2 close fd 为了说明为了说明 if 语句的必要向语句的必要向 假设假设 fd 是是 1 画出每次调用画出每次调用 dup2 时时 3 个描述符个描述符 项及相应的文件表项的变化情况 然后画出项及相应的文件表项的变化情况 然后画出 fd 为为 3 的情况 的情况 解析 解析 到这里相信图不再难画 如果对这个状态图仍然有疑问 那么就需要回头对 3 10 节中的内容好好研究一番了 不过问题是即使是画出图来也看不出什么问 题 感觉一切都很正常 我们很难看出调用 close 的必要性 很明显文件描述符 可以被成功复制的次数与题干中的过程没有直接关联 这里应该是包含这一个隐含的条件 在复制完文件描述符之后 仅仅希望通 过描述符 0 1 和 2 进行对文件的访问 这样一来问题便能解释通了 如果是在 这样一个期望的前提下 调用 close 就有必要性了 不过我们不应该忽视的是文 件描述符 0 到 2 通常对应的分别是标准输入 标准输出和标准错误输出 这样做 一定是有特别用意的 我们不妨在以后的代码中注意一下这个问题 3 5 在在 Bourne shell Bourne again shell 和和 Korn shell 中 中 digit1 digit2 表 表 示要将描述符示要将描述符 digit1 重定向至描述符重定向至描述符 digit2 的同一文件的同一文件 请说明下面两条命令的请说明下面两条命令的 区别 区别 a out outfile 2 1 a out 2 1 outfile 提示 提示 shell 从左到右处理命令行 从左到右处理命令行 解析 解析 这个就是按照命令做解释就可以了 很容易就会发现两个命令的含义完全不 一样 第一条命令是先将标准输出的内容重定向到 outfile 文件中 之后将标准错 误输出的内容定向到与标准输出相同的文件中 也就是 outfile 文件 最终的结果 就是把标准输出内容与标准错误输出内容都定向到了 outfile 文件 而第二条命令解释的结果是先将标准错误输出定向到标准输出相同的文件 中 由于此时标准输出并没有被定向到其它文件中 所以标准错误输出仍然会输 出到终端上 之后的动作就是将标准输出的内容定向到 outfile 文件中 当然这个 对之前的 2 1 并不造成影响 这条命令最终结果就是仅仅将标准输出的内容定 向到了 outfile 文件中 3 6 如果使用添加标志打开一个文件以便读 写 能否仍然用如果使用添加标志打开一个文件以便读 写 能否仍然用 lseek 在任意位置在任意位置 开始读 能否使用开始读 能否使用 lseek 更新文件中任一部分的数据 请编写一段程序以验证更新文件中任一部分的数据 请编写一段程序以验证 之 之 解析 解析 所谓的添加标志就是 O APPEND 标志 当我们指定这个标志的时候 每次 写操作都会原子性的定位到文件结尾并开始写操作 当然指定了这个标志对读操 作没有直接的影响 我们仍然可以先调用 lseek 函数并从指定的偏量处读取一定 的数据 不过我们要注意的是指定 O APPEND 标志时 执行写操作后并不会还 原之前的偏量位置 所以在写操作后紧接着进行一次读操作只能读到 0 个字节数 据 也就是读到文件结尾 我们按照标准所保证的行为来说 在这种情况

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论