這是apue的一個習題,要求不用fcntl來實現dup2.這是我的思路:循環調用dup復制file descriptor,直到與指定的相同。如果您有更高效的方法,請告訴小弟我,非常感謝!
代碼如下:
#include <apue.h>
#include <unistd.h>
#include <my_error.h>
#include <fcntl.h>
#define MAX 1000
//function:neil_dup2
int neil_dup2(int filedes,int filedes2)
{
if(filedes2==filedes)
return filedes;
close(filedes2);
int fd_list[MAX]={0};
int i,j;
for(i=0;i<=filedes2;i++)
{
if( (fd_list[i]=dup(filedes))<0)
err_sys("error dup!");
if(fd_list[i]==filedes2)
break;
}
for(j=0;j<i;j++)
close(fd_list[j]);
return fd_list[i];
}
int main()
{
int fd1;
int fd2=10;
int n=0;
char buf[]="1234567891";
if( (fd1=open("temp.foo",O_RDWR))<0 )
err_sys("open error!");
dup2(fd1,fd2);
if( (n=write(fd2,buf,10))!=10)
error("error write");
close(fd1);
close(fd2);
return 0;
}