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

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

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

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

#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

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

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

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

  • 26
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
这个错误是因为在编译过程找不到apue.h文件导致的。通常情况下,apue.h是一个头文件,用于包含在C程序使用的一些函数和定义。在Linux下,这个头文件通常是由一个库文件提供的。根据你提供的信息,你可能没有正确设置编译环境,或者没有将apue.h头文件包含在你的编译命令。 为了解决这个问题,你可以按照以下步骤进行操作: 1. 确保你已经正确安装了apue库文件。可以使用命令`apt-get install libapue-dev`来安装这个库文件。 2. 确保你的编译命令包含了正确的头文件路径。你可以使用`-I`选项来指定头文件的路径。例如,`gcc -o myprogram myprogram.c -I/path/to/apue/include`。 3. 如果你已经安装了apue库文件,但是还是找不到apue.h文件,那么可能是因为头文件没有正确地安装到系统目录。你可以动将apue.h文件复制到/usr/include/目录下。可以使用命令`cp /path/to/apue/include/apue.h /usr/include/`来复制文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Unix环境高级编程——解决第一个问题“apue.h: No such file or directory”](https://blog.csdn.net/qq_41899773/article/details/107376991)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [unix高级编程时遇到apue.h 报错问题](https://blog.csdn.net/zhuqinfeng/article/details/50468178)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值