原文网址:http://www.cnblogs.com/fusae-blog/p/4256794.html

APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了。

dup和dup2函数:用来复制文件描述符的

sync函数,fsync函数和fdatasync函数:大致的功能是将缓冲区的数据刷进队列中,等待写入到硬盘中。

fcnti函数:可以改变已打开文件的性质。

ioctl函数:控制设备。

习题:

1.当读/写磁盘文件时,本章中描述的函数是否有缓冲机制?请说明原因。

答:是没有的。上述提到的函数是open,read,write等基于POSIX的函数,是直接调用内核中的一个系统调用。而ISO C的标准输入输出函数才是有缓冲的函数,引入了流的概念。具体可参照这篇文章:http://blog.csdn.net/zhangxinrun/article/details/5873047

2.编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理。

答:首先要知道dup2函数的功能和fcntl函数的功能。

dup2函数:

功能:复制一个文件描述符,并返回一个任意指定的文件描述符。

#include <unistd.h>

int dup2(int oldfd, int newfd);

返回:newfd

如果newfd已经打开,则先将其关闭。

fcntl函数:

目前只需知道dup2(oldfd, newfd) 等效于

close(newfd);

fcntl(oldfd, F_DUPFD, oldfd);

思路:

1.先关闭newfd,以防万一。然后利用dup(oldfd),不断产生新的fd,直至fd==newfd,再关闭掉其余的fd。

2.因为oldfd和newfd都代表同一个文件,所以其实就是其文件指针指向同一个文件表。所以给文件指针赋值也行,但是不知道结构体的内容,所以也就无法执行了。

思路1代码:

  1. /*实现dup2函数,不能用fcntl函数*/
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #define BUFFSIZE    4096
  7. #define SIZE    20
  8. int my_dup2(int oldfd, int newfd);
  9. int main(void)
  10. {
  11. char    *filename = "test";
  12. int newfd = 10;
  13. char    buf[BUFFSIZE];
  14. int oldfd = open(filename, O_RDONLY);   /* 打开一个文件 */
  15. int n;
  16. my_dup2(oldfd, newfd);
  17. /* 将test文件(注意:fd是用了newfd)的内容输出到stdout里 */
  18. while ((n = read(newfd, buf, BUFFSIZE)) > 0)
  19. if (write(STDOUT_FILENO ,buf, n) != n)
  20. {
  21. perror("write error");
  22. exit(1);
  23. }
  24. if (n < 0)
  25. {
  26. perror("read error");
  27. exit(1);
  28. }
  29. close(newfd);
  30. exit(0);
  31. }
  32. int my_dup2(int oldfd, int newfd)
  33. {
  34. int tmp[SIZE];
  35. int i = 0;
  36. if (oldfd == newfd)
  37. return newfd;
  38. close(newfd);
  39. /*利用dup函数不断产生新的fd,如果fd跟newfd相等,则停止*/
  40. while (1)
  41. {
  42. tmp[i] = dup(oldfd);
  43. if(tmp[i] == newfd)
  44. break;
  45. i++;
  46. }
  47. /* 关掉多余的fd */
  48. i = 0;
  49. while (1)
  50. {
  51. if(tmp[i] != newfd)
  52. {
  53. close(tmp[i]);
  54. i++;
  55. }
  56. else
  57. break;
  58. }
  59. return newfd;
  60. }

结果运行如下:

如果将中间那个my_dup2函数注释掉的话,结果如下:

到此,习题3-2解决!

习题部分就做到这里好了,或许有空会更新接下来的习题部分。

【转】《APUE》第三章笔记(4)及习题3-2的更多相关文章

  1. 《APUE》第三章笔记(3)

    文件共享 UNIX系统支持在不同进程中共享打开的文件,首先先用一幅apue的图来介绍一下内核用于I/O文件的数据结构: 如图所见,一个进程都会有一个记录项,记录项中包含有一张打开文件描述符表,每个描述 ...

  2. 《APUE》第三章笔记(2)

    read函数 调用read函数从打开的文件中读数据. #include <unistd.h> ssize_t read(int filedes, void *buf, size_t nby ...

  3. 《APUE》第三章笔记(1)

    以下内容是我看<APUE>第二版第三章的笔记,有错还希望指出来,谢谢. unbuffered I/O,跟buffered I/O相对,buffered I/O就是 ISO C标准下的标准输 ...

  4. 《APUE》第三章笔记(4)及习题3-2

    APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. dup和dup2函数:用来复制文件描述符的 sync函数,fsync函数和fdatasync函数:大致的功 ...

  5. HBase in Action前三章笔记

    近期接触HBase,看了HBase In Action的英文版.開始认为还行,做了些笔记.可是兴许看下去,越来越感觉到实战这本书比較偏使用上的细节,对于HBase的具体设计涉及得很少.把前三章的一些笔 ...

  6. 《HALCON数字图像处理》第三章笔记

    目录 第三章 HALCON图像处理基础 HALCON控制语句 HALCON算子 HALCON图像处理入门 HALCON图像读取 HALCON图像显示 图形窗口 图像显示 显示文字 HALCON图像转换 ...

  7. [ APUE ] 第三章 文件系统

    1. 文件描述符 打开或创建一个文件时,内核向进程返回一个文件描述符,当读.写一个文件时,用open()或creat()返回的文件描述符标识该文件,将其作为参数传递给write.read. stdin ...

  8. unix环境高级编程第三章笔记

    文件描述符 1.文件描述符的概念 对于内核而言,所有打开的文件都会用一个文件描述符来引用,打开或和创建一个新文件的时候,内核会给进程返回一个文件描述符,而当使用read write时,可以使用这个文件 ...

  9. Vue2.5开发去哪儿网App 第三章笔记 上

    1.  vue 生命周期函数 每个 Vue 实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测(data observer).编译模版.挂载实例到 DOM ,然后在数据变化时更新 ...

随机推荐

  1. VS2010字体设置+推荐字体

    字体的设置在工具->选项->环境->字体和颜色. 相信大家在用VS2010的时候都会觉得默认的字体不是很好看,尤其是看的时间长了以后,更是累眼睛,这里推荐一个字体,个人感觉像是加粗加 ...

  2. Unity3D–Texture图片空间和内存占用分析(转载)

    原地址:http://www.unity蛮牛.com/home.php?mod=space&uid=1801&do=blog&id=756 Texture图片空间和内存占用分析 ...

  3. linux网卡速率和双工模式的配置

    linux网卡速率和双工模式的配置 (2012-09-06 14:39:57) 转载▼ 标签: 科技 网络接口 协商 网卡 工具 it 分类: Linux 改变网络接口的速度和协商方式的工具miito ...

  4. poj 1797 Heavy Transportation(最短路变种2,连通图的最小边)

    题目 改动见下,请自行画图理解 具体细节也请看下面的代码: 这个花了300多ms #define _CRT_SECURE_NO_WARNINGS #include<string.h> #i ...

  5. ubuntu下hadoop2.6在eclipse上的配置

    1.复制hadoop-eclipse-plugin-2.6.0.jar插件到eclipse的plugins目录下(hadoop2.6的插件,在hadoop自带上没有,要上网下载,多试几个 如果是从ub ...

  6. 搭建hadoop环境,在win7的eclipse上远程操作(Linux上)hadoop2.6.0出错的一些总结

    问题1:在DFS Lcation 上不能对文件进行操作: 解决方法: 在hadoop上的每个节点上修改该文件 conf/mapred-site.xml,增加: <property> < ...

  7. 【转】Android 实现“再按一次退出程序”

    From:http://blog.csdn.net/ldj299/article/details/7574365 个人觉得当用户按下后退键时,出现"再按一次退出"的提示防止误操作比 ...

  8. python list去重的方法

    转载于:http://yxmhero1989.blog.163.com/blog/static/112157956201381443244790/ Python很简洁 我们喜欢简单有效的代码   一. ...

  9. 发送消息执行记事本的“另存为”菜单功能(通过WM_COMMAND控制使用别的程序的菜单命令)

    发送消息执行记事本的“另存为”菜单功能procedure TForm1.FormCreate(Sender: TObject);var hNotepad: Cardinal;begin hNotepa ...

  10. C++:运算符重载函数之成员运算符重载函数

    5.2.3 成员运算符重载函数 在C++中可以把运算符重载函数定义为某个类的成员函数,称之为成员运算符重载函数. 1. 定义成员运算符重载函数的语法形式 (1)在类的内部,定义成员运算符重载函数的格式 ...