《UNIX环境高级编程》学习笔记--第三章习题2参考答案
来源:互联网 发布:js插件如何编写 编辑:程序博客网 时间:2024/06/05 07:29
题目咋看上去不好写,其实只要理解了dup函数和dup2函数的功能以及他们参数的限制,可以很快想到使用dup函数实现dup2函数。
先来说下dup函数,他是复制一个文件描述符,而复制的文件描述符的值为当前系统未被使用的文件描述符的最小值。成功返回复制的文件描述符,失败返回-1。
再来看下dup2函数,他同样复制一个文件描述符,但由用户指定要复制的文件描述符的值(即函数的第二个参数fd2),首先要明确fd2为0时,此时dup2等于dup。
如果fd2与dup2函数的第一个参数(即fd)相同,则直接返回即可。比较难的地方是,当fd2不等于fd时,且fd2不等于0,此时我们要先关闭fd2,如果fd2已经被打开,则close执行成功,此时,系统未被使用的文件描述符的最小值就变成了fd2,此时调用dup的返回值肯定为fd2。如果fd2没有被打开,close调用失败,那我们就一直调用dup,直到dup的返回值为fd2,此时就完成了复制文件描述符的工作了,再把之前dup打开的文件描述符关闭即可(保存一个数组中)。
下面是完整代码
#include <stdio.h>#include <unistd.h>#include <fcntl.h>int mydup2(int fd,int fd2){ int fds[256]; int t = -1; int i = 0; if (fd2 < 0 || fd2 > 256) { printf("fd2 must more than 0 and less than 256\n"); return -1; } if (fd2 == 0) return dup(fd); if (fd == fd2) return fd; else { if ( close(fd2) == 0) { return dup(fd); } else { while(t != fd2) { t = dup(fd); fds[i] = t; ++i; } t = i - 1; for(i = 0;i < t;++i) close(fds[i]); return fd[t-1]; } }}int main(int argv,char **args){ if (argv != 3) { printf("useage:three args!\n"); return -1; } int fd = atoi(args[1]); int fd2 = atoi(args[2]); int t = mydup2(fd,fd2); printf("%d\n",t); return 0;}
0 0
- 《UNIX环境高级编程》学习笔记--第三章习题2参考答案
- Unix环境高级编程 第三章习题答案
- UNIX环境高级编程———第三章习题
- unix环境高级编程第三章习题的一些拙见
- UNIX环境高级编程习题之第三章第二题
- UNIX环境高级编程习题——第三章
- Unix环境高级编程第三章习题2(转载修改)
- UNIX环境高级编程(第三版)学习笔记(一、UNIX基础知识)
- UNIX环境高级编程(第三版)学习笔记(二、UNIX标准及实现)
- UNIX环境高级编程第三章
- UNIX环境高级编程(学习笔记)
- 《Unix环境高级编程》学习笔记
- unix环境高级编程 学习笔记3
- unix环境高级编程 学习笔记4
- Unix环境高级编程 第一章 学习笔记
- Unix环境高级编程学习笔记整理
- UNIX环境高级编程学习笔记
- 学习《UNIX环境高级编程》笔记
- hdu2046 骨牌铺方格
- python 9.2 multiprocessing
- 异常
- 硬盘的存储原理和内部架构
- 2015.9.1组队赛第2场1003
- 《UNIX环境高级编程》学习笔记--第三章习题2参考答案
- 精品软件 推荐 SSD固态硬盘潜能释放器 SSDRunner
- C++中const的实现细节
- 系统瓶颈的定位
- 【HDU4185】【最大二分匹配】【无法确定uN,vN就结果/2】
- Volley
- HDOJ 4081 Qin Shi Huang's National Road System (次小生成树变形--prime)
- 引用与指针有什么区别?
- 34. PHP 类