/*
*编写一个与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;
}