3.2 编写一个与3.12节中dup2()功能相同的函数,要求不调用fcntl()函数,并且要有正确的出错处理。
int dup2(int filedes, int filedes2); 将filedes2对应的打开文件置为filedes对应的打开文件,之后就可以使用filedes2操作filedes打开的文件。
由于要复制一个文件描述符,而且不能使用fcntl(),那么,唯一能使用的就是dup()了:
int dup(int filedes); 复制一个当前可用的最小的文件描述符,使它对应的打开文件是filedes对应的打开文件。
这里采用的主要思想是:dup()返回的是当前可用的最小的文件描述符,那么就可以使用遍历,从dup(filedes)开始遍历,知道返回的文件描述符等于filedes2。
下面介绍主要流程:
当filedes2是无效文件描述符时,输出错误信息,那么什么样的是无效文件描述符呢?就是小于0或者大于进程可以打开的最大文件数时,文件描述符是无效的。
然后就可以分为三种情况:
filedes == filedes2: 直接返回filedes2
filedes > filedes2: 关闭filedes2,再进行dup(filedes)返回值应该就是filedes
filedes < filedes2: 从dup(filedes)开始遍历,直到返回值等于filedes2,然后关闭filedes2,再dup(filedes)返回值应该就是filedes
后面两种情况可以结合一下,看看代码,代码参考了