dup2函数用来复制一个现存的文件描述符
int dup2(int filedes, int filedes2);
若成功则返回新的文件描述符,若出错则返回-1.filedes2参数指定新描述符的数值,如果filedes2已经打开,则先将其关闭。如果filedes等于filedes2,则dup2返回filedes2,而不关闭它。
返回的新文件描述符与参数filedes共享同一个文件表项。
课后习题要求实现一个与dup2功能类似的函数,且不能使用fcntl函数。
先找到能够显式提供文件描述符的函数:open(若成功返回文件描述符),create(若成功则返回只写打开的文件描述符),dup(复制一个现存的文件描述符)。所以利用open函数获取文件描述符,然后选用dup函数进行复制。参考某位高手的代码:
#include "apue.h"
#include <fcntl.h>
int my_dup(const int file_flag,const int obj_flag)
{
int i,n,top=0;
int stack[MAXLINE];
if(obj_flag>MAXLINE||obj_flag<3)//保证文件描述符符合要求
{
printf("obj_flag error!\n");
return -1;
}
if(obj_flag==file_obj)
return file_obj;
while((n=dup(file_flag)<obj_flag))
{
if(-1==n)
{
printf("Copy failed");
return -1;
}
stack[top++]=n; //储存需要释放的文件描述符
}
close(obj_flag);
if(-1==dup(file_flag))
{
printf("Dup failed\n");
return -1;
}
for(i=0;i<top;i++)
{
close(stack[i]);
}
return 1;
}