#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;
}
【apue】习题3.2:写一个与dup2功能相同的函数,要求不使用fcntl函数,并且要有正确的错误处理
最新推荐文章于 2020-12-28 21:48:31 发布