前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >APUE学习手札 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理

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

作者头像
glm233
发布2020-10-09 15:02:55
8460
发布2020-10-09 15:02:55
举报

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

思路,不断执行dup函数,直到返回与newfd相同的文件描述符,所有都执行结束之后关闭之前dup返回的文件描述符

不要忘记特判newfd和fd相同的情况,直接返回。记住dup2还多了一歩先关闭newfd的步骤

代码语言:javascript
复制
#include "apue.h"
#define BUFFSIZE 16
int main()
{
	char buffer[BUFFSIZE];
	int fdin,fdout,n;
	fdin=my_dup(STDIN_FILENO,3);
	fdout=my_dup(STDOUT_FILENO,4);
	if(fdin==-1||fdout==-1)
	{
		err_sys("my_dup error!");
		return -1;
	}
	else
	{
		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");
	}
	return 0;
}
int my_dup(int fd,int newfd)
{

	if(fd==newfd)return fd;
	if(fd<0||fd>FOPEN_MAX)
    {
        printf("fd is wrong.\n");
        return -1;
    }
    if(newfd <0||newfd>FOPEN_MAX)
    {
        printf("newfd is wrong.\n");
        return -1;
    }
	close(newfd);
	int fileindex[newfd+1];
	int index=0;
	while((fileindex[index++]=dup(fd))!=newfd)
	{
		printf("result after dup(fd):%d\n",fileindex[index-1]);
		if(fileindex[index-1]==-1)
		{
			err_sys("my_dup error!");
			return -1;
		}
	}
	int i=0;
	for(;i<index-1;i++)
	{
		close(fileindex[i]);
	}
	return fileindex[index-1];
	
}

运行结果:

在服务器上编写3.2.c的源代码,编译,执行后如下图:

0mPMqS.png
0mPMqS.png

编译生成了一个3.2的执行文件,上述代码的功能是复制了STDIN_FILENO和STDOUT_FILENO这两个文件描述符,分别返回4和5

编译生成了一个3.2的执行文件,上述代码的功能是复制了STDIN_FILENO和STDOUT_FILENO这两个文件描述符,分别返回4和5

再通过读写验证my_dup是否调用成功,出错处理也在程序中有体现。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档