编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理(APUE)

/*
*编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理
*主要思路就是应用dup函数,不断的返回fd,看fd是否等于newfd,
*/
#include "apue.h"
#include <fcntl.h>

#define BUFFSIZE 10

typedef struct FDList
{
	int myfd;
	struct FDList *next;
}MyFdList;

int my_dup(int fd, int newfd);

int main(void)
{
	int fdin;
	int fdout;
	int n;

	char buffer[BUFFSIZE];

	fdin = my_dup(STDIN_FILENO, 4);
	fdout = my_dup(STDOUT_FILENO, 5);

	printf("STDIN fd : %d\n", fdin);
	printf("STDOUT fd : %d\n", fdout);

	while((n = read(fdin, buffer, BUFFSIZE)) > 0)
	{
		if(write(fdout, buffer, n) != n)
			err_sys("write error\n");
	}
	if(n < 0)
		printf("read error");
	exit(0);
}

int my_dup(int fd, int newfd)
{
	int fd2;
	MyFdList *p, *fl = NULL;	//fl相当是一个头指针,这个链表的添加是向前移动的,最后添加的是头节点
	
	close(newfd);

	while((fd2 = dup(fd)) != newfd)
	{
		p = (MyFdList*)malloc(sizeof(MyFdList));
		p->myfd = fd2;
		p->next = fl;
		fl = p;
	}	

	while(fl != NULL)
	{
		close(fl->myfd);
		p = fl;
		fl = fl->next;
		free(p);
	}
	return fd2;
}


/*
*编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理
*主要思路就是应用dup函数,不断的返回fd,看fd是否等于newfd,
*/
#include "apue.h"
#include <fcntl.h>

#define BUFFSIZE 10

typedef struct FDList
{
	int myfd;
	struct FDList *link;
}MyFdList;

int my_dup(int fd, int newfd);

int main(void)
{
	int fdin;
	int fdout;
	int n;

	char buffer[BUFFSIZE];

	fdin = my_dup(STDIN_FILENO, 4);
	fdout = my_dup(STDOUT_FILENO, 5);

	printf("STDIN fd : %d\n", fdin);
	printf("STDOUT fd : %d\n", fdout);

	while((n = read(fdin, buffer, BUFFSIZE)) > 0)
	{
		if(write(fdout, buffer, n) != n)
			err_sys("write error\n");
	}
	if(n < 0)
		printf("read error");
	exit(0);
}

int my_dup(int fd, int newfd)
{
	int fd2;

	MyFdList *prev = NULL;	//前驱节点	
	MyFdList *p;
	MyFdList *temp;

	close(newfd);

	while((fd2 = dup(fd)) != newfd)
	{	
		p = (MyFdList*)malloc(sizeof(MyFdList));	//把不等于newfd的文件描述符暂存到链表中,也可以开辟数组暂存文件描述符
		p->myfd = fd2;
		p->link = prev;	//建立的是向前增长的链表
		prev = p;		
	}

	while(prev != NULL)
	{
		close(prev->myfd);
		temp = prev;
		prev = prev->link;
		free(temp);
	}
	return fd2;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值