1. 程式人生 > >寫一個與dup2()功能相同的函式

寫一個與dup2()功能相同的函式

//用dup()來返回檔案描述符,直到符合要求的為止,最後再把不符合要求的關閉
//2013年 06月 19日 星期三 06:23:38 HKT
//當輸入的描述符是負的或者已超過MAX_OPEN時,會出錯
#include <unistd.h>//dup()
#include <stdio.h>
#include <stdlib.h>
#define OPEN_MAX 256
int my_dup2(int, int);
int main(int argc, char *argv[])
{
	int newfd, return_fd;
	if(argc != 2)
	{
		printf("格式:./a.out test.txt\n");
		exit(0);
	}
	printf("請輸入你要設定複製的描述符: ");
	scanf("%d", &newfd);
	//開啟一個檔案
	int fd = open(argv[1], 0);//開啟一個檔案準備複製
	if(fd == -1)
	{
		perror(argv[1]);//列印錯誤資訊
		exit(0);
	}
	printf("原來的檔案描述符是: %d\n", fd);
	return_fd = my_dup2(fd, newfd);
	printf("之後的檔案描述符是: %d\n");
        close(fd);
        close(return_fd);
        exit(0);
}
int my_dup2(int fd, int newfd)
{
	int count = 0;
	int fdarry[newfd];	//記錄開啟的描述符
	if(newfd < 0 || newfd > OPEN_MAX)
	{
		printf("你設定的新描述符有誤!\n");
		exit(0);
	}

	if((fdarry[count] = dup(fd)) == -1)//返回當前最小未用的檔案描述符
	{
		printf("dup()函數出錯!\n");
		exit(0);
	}
	else//的是為了測試原檔案描述符是否可用
	{
		close(fdarry[count]);	
	}
	if(fd == newfd)//如果新設定的與原來的相等則直接接返回原來的
	{
		return fd;
	}
	close(newfd);//關閉要複製的檔案描述符
	//當執行下面的程式碼時說明使用者設定的檔案描述符與一開始的並不相同
	for(count = 0; count <= newfd; count++)
	{
		fdarry[count] = dup(fd);//返回當前可用的最小檔案描述符
		if(fdarry[count] == -1)
		{
			printf("dup()出錯!\n");
			exit(0);
		}
		else
		{
			printf("for裡面的描述符為: %d\n", fdarry[count]);
			if(fdarry[count] == newfd)
				break;
		}
	}
	for(count = 0; count <= newfd; count++)
	{
		if(fdarry[count] == newfd)
			return fdarry[count];
		else
			close(fdarry[count]);	
	}
}