LINUX下dup2的實現

這是一道UNIX環境高級編程的課後習題,要求不得使用fcntl,自己始終想不出效率比較高的寫法,這裏貼一下自己的做法,希望有大俠們能告訴我一種高效率的寫法。

#include "apue.h"
#include "fcntl.h"
int new_dup2(int oldfd, int newfd)
{
	int fd_list[newfd] , i = 0, j = 0;
	printf("oldfd is %d and newfd is %d\n",oldfd,newfd);
	if (oldfd == newfd) return oldfd;
	/*if(close(newfd) == -1)
	{
		printf("close newfd err\n");
		return 0;
	}*/
	for (i = 0; i < newfd; i++)
	{
		//printf("i = %d\n",i);
		if((fd_list[i] = dup(oldfd)) == -1)
		{
			printf("dup err\n");
			break;
		}
		//printf("fd_list[i] = %d\n",fd_list[i]);
		if(fd_list[i] == newfd)
		{
			printf("fd_list i = %d\n",i);
			break;
		}
	}
	
	for(j = 0; j<i ;j++) close(fd_list[j]); 
	return fd_list[i];
}

int main()
{
	int fd,dest_fd = 33,fd1;
	char *path = "open_fd" ;
	fd = open(path,O_RDWR|O_CREAT);
	if(fd == -1) 
	{
		printf("open file err \n");
		return 0;
	}else
	{
		printf("open file %d success \n",fd);
	}
	if((fd1 = new_dup2(fd,dest_fd)) != dest_fd)
	{
		printf("Copy fd err : %d\n",fd1);
		return 0;
	}
	write(fd1,path,sizeof(path));
	return 1;
}


發佈了19 篇原創文章 · 獲贊 7 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章