【转】《APUE》第三章笔记(4)及习题3-2
原文网址: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代码:
- /*实现dup2函数,不能用fcntl函数*/
- #include <unistd.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <stdlib.h>
- #define BUFFSIZE 4096
- #define SIZE 20
- int my_dup2(int oldfd, int newfd);
- int main(void)
- {
- char *filename = "test";
- int newfd = 10;
- char buf[BUFFSIZE];
- int oldfd = open(filename, O_RDONLY); /* 打开一个文件 */
- int n;
- my_dup2(oldfd, newfd);
- /* 将test文件(注意:fd是用了newfd)的内容输出到stdout里 */
- while ((n = read(newfd, buf, BUFFSIZE)) > 0)
- if (write(STDOUT_FILENO ,buf, n) != n)
- {
- perror("write error");
- exit(1);
- }
- if (n < 0)
- {
- perror("read error");
- exit(1);
- }
- close(newfd);
- exit(0);
- }
- int my_dup2(int oldfd, int newfd)
- {
- int tmp[SIZE];
- int i = 0;
- if (oldfd == newfd)
- return newfd;
- close(newfd);
- /*利用dup函数不断产生新的fd,如果fd跟newfd相等,则停止*/
- while (1)
- {
- tmp[i] = dup(oldfd);
- if(tmp[i] == newfd)
- break;
- i++;
- }
- /* 关掉多余的fd */
- i = 0;
- while (1)
- {
- if(tmp[i] != newfd)
- {
- close(tmp[i]);
- i++;
- }
- else
- break;
- }
- return newfd;
- }
结果运行如下:
如果将中间那个my_dup2函数注释掉的话,结果如下:
到此,习题3-2解决!
习题部分就做到这里好了,或许有空会更新接下来的习题部分。
【转】《APUE》第三章笔记(4)及习题3-2的更多相关文章
- 《APUE》第三章笔记(3)
文件共享 UNIX系统支持在不同进程中共享打开的文件,首先先用一幅apue的图来介绍一下内核用于I/O文件的数据结构: 如图所见,一个进程都会有一个记录项,记录项中包含有一张打开文件描述符表,每个描述 ...
- 《APUE》第三章笔记(2)
read函数 调用read函数从打开的文件中读数据. #include <unistd.h> ssize_t read(int filedes, void *buf, size_t nby ...
- 《APUE》第三章笔记(1)
以下内容是我看<APUE>第二版第三章的笔记,有错还希望指出来,谢谢. unbuffered I/O,跟buffered I/O相对,buffered I/O就是 ISO C标准下的标准输 ...
- 《APUE》第三章笔记(4)及习题3-2
APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. dup和dup2函数:用来复制文件描述符的 sync函数,fsync函数和fdatasync函数:大致的功 ...
- HBase in Action前三章笔记
近期接触HBase,看了HBase In Action的英文版.開始认为还行,做了些笔记.可是兴许看下去,越来越感觉到实战这本书比較偏使用上的细节,对于HBase的具体设计涉及得很少.把前三章的一些笔 ...
- 《HALCON数字图像处理》第三章笔记
目录 第三章 HALCON图像处理基础 HALCON控制语句 HALCON算子 HALCON图像处理入门 HALCON图像读取 HALCON图像显示 图形窗口 图像显示 显示文字 HALCON图像转换 ...
- [ APUE ] 第三章 文件系统
1. 文件描述符 打开或创建一个文件时,内核向进程返回一个文件描述符,当读.写一个文件时,用open()或creat()返回的文件描述符标识该文件,将其作为参数传递给write.read. stdin ...
- unix环境高级编程第三章笔记
文件描述符 1.文件描述符的概念 对于内核而言,所有打开的文件都会用一个文件描述符来引用,打开或和创建一个新文件的时候,内核会给进程返回一个文件描述符,而当使用read write时,可以使用这个文件 ...
- Vue2.5开发去哪儿网App 第三章笔记 上
1. vue 生命周期函数 每个 Vue 实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测(data observer).编译模版.挂载实例到 DOM ,然后在数据变化时更新 ...
随机推荐
- 任务调度 QUARTZ
任务调度在目前的JAVA应用程序中运用的十分普遍,故掌握QUARTZ是必备的技能 闲话少说,上官网:http://www.quartz-scheduler.org/ 下载最新1.80资源包 commo ...
- 时序列数据库武斗大会之TSDB名录 Part 2
[编者按] 刘斌,OneAPM后端研发工程师,拥有10多年编程经验,参与过大型金融.通信以及Android手机操作系的开发,熟悉Linux及后台开发技术.曾参与翻译过<第一本Docker书> ...
- hadoop2.2.0集群搭建与部署
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3818908.html 一.安装环境 1.系统环境 CentOS 6.4 2.集群机器节点ip 节点一i ...
- Spring 注入static变量
一般我们我想注入一个static的变量,如下: @Autowired private static String str; 不过,这样最终结果为null. 1.使用配置文件的方式注入 priva ...
- springmvc图片上传
//-------------------------------------上传图片--------------------------------------------------- @Requ ...
- javaWEB邮件测试
新建一个工具类: Mail.java 该类的主要关键点是:1.设置系统属性.也就是你是用什么协议来进行邮件发送的,邮件协议有很多在种,比如impt,smpt,prop等协议, 我现在测试用的是smpt ...
- eclipse中clean操作中如何将validating除去
eclipse中去掉js validating方法:1. 删除.project文件中的 <buildSpec></buildSpec>中的:<buildCommand&g ...
- ASP.NET并发处理
http://blog.csdn.net/hliq5399/article/details/6280288
- json的数据格式(仔细查看)
1.json对象就是jsonObject,jsonobject里可以放入很多键值对,并以逗号为分隔符. jsonObject里还可以嵌套JsonObject对象,或者数组信息作为value,数组作为k ...
- 高效的Nginx
FastCGI是将CGI解释器进程保持在内存中并因此获得较高的性能.CGI解释器的反复加载是CGI性能低下的主要原因. 如果CGI解释器保持在内存中并接受FastCGI管理器的调度,则可以提供良好的性 ...