Unix环境高级编程习题3.2
来源:互联网 发布:casiofx991es矩阵求逆 编辑:程序博客网 时间:2024/05/05 11:14
- 题目
3.2 Write your own dup2 function that performs the same service as the dup2 function described in Section 3.12, without calling the fcntl function. Be sure to handle errors correctly.(实现自己的dup2函数,不能使用fcntl函数,注意处理错误值。)
- 函数原型
- 函数功能
- 思路
- 我的解
#include <apue.h>// excise 3.2 by fred yu// implementation your own dup2 function without using fcntl.int my_dup2(int fd, int fd2){ int tmpfd = -1, i, lastfd; int * fds; if (fd2 < 0#ifdef OPEN_MAX || fd2 > OPEN_MAX#endif ) { errno = EBADF; printf("my_dup2, %d] fd2 is not a valid number.\n", __LINE__); return -1; } tmpfd = dup(fd2); if (tmpfd == -1) { switch (errno) { case EBADF: // fd2 is not opened. break; case EMFILE: if (close(fd2) == -1) { printf("my_dup2, %d] close fd2 failed.\n", __LINE__); return -1; } break; default: printf("my_dup2, %d] dup fd2 failed.\n", __LINE__); return -1; } } else { if (close(tmpfd) == -1) { printf("my_dup2, %d] close tmpfd failed.\n", __LINE__); return -1; } if (close(fd2) == -1) { printf("my_dup2, %d] close fd2 failed.\n", __LINE__); return -1; } } fds = (int *)malloc(fd2 * sizeof(int)); if (!fds) { printf("my_dup2, %d] malloc fds failed.\n", __LINE__); errno = ENOMEM; return -1; } for (i = 0; i < fd2; ++i) { fds[i] = -1; } lastfd = -1; while (tmpfd = dup(fd)) { if (tmpfd == -1) { printf("my_dup2, %d] dup fd failed, fd=%d, lastfd=%d, err=%d.\n", __LINE__, fd, lastfd, errno); goto FAIL_EXIT; } else if (tmpfd == fd2) { break; } else { fds[tmpfd] = tmpfd; lastfd = tmpfd; } } for (i = 0; i < fd2; ++i) { if (fds[i] != -1) close(fds[i]); } free(fds); return fd2;FAIL_EXIT: for (i = 0; i < fd2; ++i) { if (fds[i] != -1) close(fds[i]); } free(fds); return -1;}int test_my_dup2(int argc, char * argv[]){ int fd; if (argc < 3) { printf("usage: excise oldfd newfd\n"); return 0; } fd = my_dup2(atoi(argv[1]), atoi(argv[2])); if (fd == -1) { printf("dup2 fd failed\n"); return -1; } printf("return fd by my_dup2 is %d", fd); return 0;}int main(int argc, char * argv[]){ test_my_dup2(argc, argv); exit(0);}
- Unix环境高级编程习题3.2
- UNIX 环境高级编程习题3.2
- UNIX环境高级编程习题 5.1
- unix高级环境编程.第一章习题答案
- UNIX环境高级编程习题 4.11 myftw改造
- Unix环境高级编程 第三章习题答案
- 《unix环境高级编程》APUE 习题5.4 的解答
- unix高级环境编程 第二十章 数据库函数库:习题讨论
- UNIX环境高级编程———第三章习题
- unix环境高级编程第三章习题的一些拙见
- unix环境高级编程第四章习题的一些拙见
- unix环境高级编程第五章习题的一些拙见
- unix环境高级编程第六章习题的一些拙见
- unix环境高级编程第七章习题的一些拙见
- UNIX环境高级编程习题之第三章第二题
- UNIX环境高级编程习题——第一章
- UNIX环境高级编程习题——第二章
- UNIX环境高级编程习题——第三章
- 传惠普任命新CEO不改变公司战略 股价盘中跌4%
- 为性能和可伸缩性做架构和设计上的Review
- 方法的重写
- Oracle中如何创建方案
- 构造方法
- Unix环境高级编程习题3.2
- static关键字
- Oracle日期相减
- C# 链接 oracle数据库
- 内存分析
- flex spark skin
- 业界资讯 Starling project
- Oracle中的日期字段处理
- 不用光驱,不用分区,不用格式化,硬盘模式安装双系统XP+linux ubuntu==wubi