APUE学习手札 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理
时间:2022-07-26
本文章向大家介绍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 : %dn", fdin);
printf("STDOUT fd : %dn", 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):%dn",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的源代码,编译,执行后如下图:
编译生成了一个3.2的执行文件,上述代码的功能是复制了STDIN_FILENO和STDOUT_FILENO这两个文件描述符,分别返回4和5
编译生成了一个3.2的执行文件,上述代码的功能是复制了STDIN_FILENO和STDOUT_FILENO这两个文件描述符,分别返回4和5
再通过读写验证my_dup是否调用成功,出错处理也在程序中有体现。
- Entity Framework——建模建库
- asp.net web api 构建api帮助文档
- TensorFlow从0到1 | 第十八章: 升级手记:TensorFlow 1.3.0
- 设计一个可扩展的用户登录系统
- 字符串和编码
- windows service编程
- Entity Framework——常见报错总结
- MySQL 主从复制的原理和配置
- Entity Framework——读写分离
- 如何在 MySQL 中判断中文字符?
- Entity Framework——执行sql语句
- 深入浅析PHP7.0新特征(五大新特征)
- 走在专家的路上,每天优化一条SQL
- 用GenePred注释文件进行数据分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux Crontab Shell脚本实现秒级定时任务的办法
- laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
- yii框架使用分页的方法分析
- Linux服务器间文件实时同步的实现
- TP3.2.3框架文件上传操作实例详解
- yii2.0框架场景的简单使用示例
- Laravel5.6框架使用CKEditor5相关配置详解
- 怎么在Linux中自定义bash命令提示符
- Hbase入门详解
- php使用curl模拟多线程实现批处理功能示例
- php实现的简单多进程服务器类完整示例
- Linux磁盘挂载、分区、扩容操作的实现办法
- PHP商品秒杀问题解决方案实例详解【mysql与redis】
- PHP设计模式之组合模式定义与应用示例
- php使用socket调用http和smtp协议实例小结