APUE习题[实现dup2函数功能,不使用fcntl]
来源:互联网 发布:数据颗粒度是什么意思 编辑:程序博客网 时间:2024/04/29 13:42
APUE第三章习题[实现dup2函数功能,不使用fcntl]
int dup2(int oldhandle, int newhandle);
函数功能:
复制文件句柄,newhandle指定的dup2和dup的区别就是可以用newfd参数指定新描述符的数值,如果newfd已经打开,则先将其关闭。如果newfd等于oldfd,则dup2返回newfd, 而不关闭它。dup2函数返回的新文件描述符同样与参数oldfd共享同一文件表项。
关键部分实现思路:
先close关闭需要复制到的文件描述符newdup。
连续dup,每dup一次产生的新的fd记录下来。
当新产生的fd等于需要产生的fd的时候,跳出循环,并把前面产生的fd全都close掉,返回该描述符。
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
int my_dup(int olddup,int newdup);
int main(int argc,char ** argv)
{
int newdup = 3;
const char * filename = "newfile.txt";
int fd = open(filename,O_RDWR);
int newfd = my_dup(fd,newdup);
if(write(newfd,"Test new fd.",strlen("Test new fd.")) < 0)
{
printf("Use new fd write file failed.");
exit(2);
}else
{
printf("Write successfully.");
}
exit(0);
}
int my_dup(int olddup,int newdup)
{
int tempdup;
int icount = 0;
int filedesarr[newdup];
if((tempdup = dup(olddup)) == -1) //判断原文件描述符是否有效
{
printf("the file desp is invalid.");
exit(1);
}else
{
close(tempdup);
}
if(newdup == olddup) //若新旧文件描述符相等则直接返回
{
return olddup;
}
close(newdup);//关闭要复制的文件描述符
for(icount = 0;icount<newdup+1;icount++) //循环复制文件描述符
{
filedesarr[icount] = 0;
tempdup = dup(newdup);
if(tempdup < 0)
{
return -1;
}else
{
if(tempdup == newdup)
{ //若复制后的文件描述符于指定的相等则跳出
break;
}else{
filedesarr[icount] = 1; //否则将对应下标的数组元素置为1
}
}
}
for(icount = 0;icount<newdup+1;icount++) //关闭之前打开的非指定描述符
{
if(filedesarr[icount] == 1)
{
close(icount);
}
}
return tempdup;
}
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
int my_dup(int olddup,int newdup);
int main(int argc,char ** argv)
{
int newdup = 3;
const char * filename = "newfile.txt";
int fd = open(filename,O_RDWR);
int newfd = my_dup(fd,newdup);
if(write(newfd,"Test new fd.",strlen("Test new fd.")) < 0)
{
printf("Use new fd write file failed.");
exit(2);
}else
{
printf("Write successfully.");
}
exit(0);
}
int my_dup(int olddup,int newdup)
{
int tempdup;
int icount = 0;
int filedesarr[newdup];
if((tempdup = dup(olddup)) == -1) //判断原文件描述符是否有效
{
printf("the file desp is invalid.");
exit(1);
}else
{
close(tempdup);
}
if(newdup == olddup) //若新旧文件描述符相等则直接返回
{
return olddup;
}
close(newdup);//关闭要复制的文件描述符
for(icount = 0;icount<newdup+1;icount++) //循环复制文件描述符
{
filedesarr[icount] = 0;
tempdup = dup(newdup);
if(tempdup < 0)
{
return -1;
}else
{
if(tempdup == newdup)
{ //若复制后的文件描述符于指定的相等则跳出
break;
}else{
filedesarr[icount] = 1; //否则将对应下标的数组元素置为1
}
}
}
for(icount = 0;icount<newdup+1;icount++) //关闭之前打开的非指定描述符
{
if(filedesarr[icount] == 1)
{
close(icount);
}
}
return tempdup;
}
注:
dup(filedes) 相当于:fcntl(filedes,F_DUPFD,0).
dup2(filedes,filedes2) 相当于:close(filedes2) ; fcntl(filedes,F_DUPFD,filedes2).
- APUE习题[实现dup2函数功能,不使用fcntl]
- APUE 习题3-2 实现dup2,要求不使用fcntl函数。
- apue第三章习题3.2 编写dup2功能相同的函数,要求不调用fcntl函数
- 实现dup2函数(不使用fcntl)
- 习题3.2:不调用fcntl函数来实现dup2的功能
- 习题3.2:不调用fcntl函数来实现dup2的功能
- APUE(习题3.2)实现与dup2功能相同的函数
- UNIX环境高级编程学习笔记(四)不调用fcntl函数实现dup2的功能
- APUE习题3.2----自己实现的dup2( )函数的源码
- APUE习题3.2----自己实现的dup2( )函数的源码
- 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理(APUE)
- 编写一个与dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理
- Unix环境编程 如何实现dup2函数,不允许调用fcntl?
- UNIX环境高级编程习题3.2 自己实现dup2函数功能
- 基于dup实现linux的dup2函数(APUE练习题3.2)
- 写一个dup2功能相同的函数,不能调用 fcntl 函数,并且要有出错处理
- 实现dup2功能相同的函数
- apue习题12.2实现
- js控制按钮倒计时
- CentOS 装VMware Tools 的问题
- cocos2dx 的简单动画创建
- 在嵌入式Linux系统上安装打印机
- 使用jquery MultiFile实现多个文件同时上传
- APUE习题[实现dup2函数功能,不使用fcntl]
- oracle学习笔记-decode函数
- Hibernate 多对一外键单向关联
- Delphi 字符串转十六进制
- Hibernate Annotations
- Qt 多线程服务器2
- WQM软件使用说明书
- 新时尚Windows8开发(38):聊天程序
- vmware虚拟机中删除一个小的磁盘,添加一个大的磁盘