【apue】习题3.2:写一个与dup2功能相同的函数,要求不使用fcntl函数,并且要有正确的错误处理

25 篇文章 0 订阅
#include "apue.h"
#include <fcntl.h>
#define MAX_FD 256
/* 几个关键点:
 * 先关闭需要复制的文件描述符newfd
 * 连续使用dup函数,产生新的fd,并且使用数组记录下来
 * 当产生新的fd等于需要的fd的时候,就跳出循环,并且把前面产生的fd都close掉
 */
int mydup(int oldfd,int newfd);
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 = mydup(fd, newfd);  
    printf("之后的文件描述符是: %d\n",return_fd);  
    close(fd);  
    close(return_fd);  
    exit(0);  
} 
 

//需要一个数据结构来存储已经打开的fd,使用数组
int mydup(int oldfd,int newfd)
{
	int filedesarr[MAX_FD]={
		300
	};
	int icount=0;
	int tempfd;
	if(newfd<0||newfd>MAX_FD)
	  err_sys("newfd out of range!\n");
	if((tempfd=dup(oldfd))==-1)//可以判断原文件描述符号是否有效
	{
		printf("the file descripter is invalid\n");
		exit(1);
	}
	else
	  close(tempfd);

	if(newfd==oldfd)//若新旧文件描述符相等则直接返回
	  return oldfd;

	close(newfd);//先关闭要复制的文件描述符
	
	for(icount=0;icount<newfd+1;icount++)//循环复制文件描述符
	{
		filedesarr[icount]=0;
		tempfd=dup(oldfd);
		if(tempfd<0){//如果产生的fd为负,则dup出错
		  return -1;
		} else if(tempfd==newfd){//如果产生的fd不为负,而且就是newfd,则跳出
			break;
		} else{//如果产生的fd不为负,且不为newfd,则将这个产生的文件描述符,保存在数组中
			filedesarr[icount]=tempfd;
		}
	}
	for(icount=0;icount<newfd+1;icount++)//关闭所有因为测试而打开的文件描述符
	{
		if(filedesarr[icount]!=300);
		{
			close(filedesarr[icount]);
		}
	}
	return tempfd;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值