参考文章:https://blog.csdn.net/andylfg/article/details/41683391
UNIX环境高级编程 chapter3
3.2 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理。
不断的利用dup复制原有文件描述符,直至产生有一个文件描述符与传入的第二个参数相等时停止。然后将前面那些文件描述符关闭,返回第二个参数的文件描述符。
#include "../../apue.3e/include/apue.h"
#include <unistd.h>
#define BUFFSIZE 40
typedef struct fdlist{
int myFd;
struct fdlist *next;
}FD_LIST;
int mydup2(int fd, int fd2);
int main(void)
{
int fdin;
int fdout;
int n;
char buf[BUFFSIZE];
fdin = mydup2(STDIN_FILENO,4);
fdout = mydup2(STDOUT_FILENO, 5);
printf("STDIN fd %d\n",fdin);
printf("STDOUT fd %d\n",fdout);
while ((n = read(fdin,buf,BUFFSIZE)) > 0)
{
if(write(fdout,buf,n) != n)
err_sys("write error\n");
}
if(n < 0)
err_sys("read error\n");
exit(0);
}
int mydup2(int fd, int fd2)
{
FD_LIST *fdNode = NULL,*p = NULL;
int newfd;
close(fd2);
while ((newfd = dup(fd)) != fd2)
{
fdNode = (FD_LIST*) malloc(sizeof(FD_LIST));
fdNode->myFd = newfd;
fdNode->next = p;
p = fdNode;
}
while (p!=NULL)
{
fdNode = p;
close(fdNode->myFd);
p = p->next;
free(fdNode);
}
return newfd;
}