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掉,返回该描述符。

注释挺详细,看注释吧

执行结果:

//Code by Pnig0s1992
//Date:2012,3,28
#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";
	// 本文URL地址:http://www.bianceng.cn/OS/Linux/201410/45509.htm
    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;
}

本文出自 “About:Blank H4cking” 博客,请务必保留此出处http://pnig0s1992.blog.51cto.com/393390/819830

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, 文件
, 函数
, include
, 看apue遇到的有关问题
, close
, dup2
, dup
, 关闭函数功能
编译APUE
,以便于您获取更多的相关知识。

时间: 2024-09-17 04:44:21

APUE习题[实现dup2函数功能,不使用fcntl]的相关文章

dup,dup2函数【转】

转自:http://eriol.iteye.com/blog/1180624 转自:http://www.cnblogs.com/jht/archive/2006/04/04/366086.html   dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符.它们经常用来重定向进程的stdin.stdout和stderr.这两个函数的原形如下:   C代码   #include <unistd.h>   int dup( int oldfd );   int dup2(

CSS3实例教程:详解calc()函数功能

文章描述:就算你通过繁琐的方法实现了,但有于浏览器的兼容性而导致最终效果不一致.虽然前面介绍的CSS3属性中的box-sizing在一定程度上解决这样的问题,其实今天的calc()函数功能实现上面的效果来得更简单. calc()对大家来说,或许很陌生,不太会相信calc()是css中的部分.因为看其外表像个函数,既然是函数为何又出现在CSS中呢?这一点也让我百思不得其解,今天有一同事告诉我,说CSS3中有一个属性能实现自适应的布局,首先让我想到的是box-sizing,但跟我说还可以计算,这让我

Lua 数学库的所有函数功能作用一览

  这篇文章主要介绍了Lua 数学库的所有函数功能作用一览,本文罗列了lua数学库的所有函数,并对每个函数的功能作用做了简短描述,需要的朋友可以参考下 math.pi 为圆周率常量 = 3.14159265358979323846 abs 取绝对值 math.abs(-15) 15 acos 反余弦函数 math.acos(0.5) 1.04719755 asin 反正弦函数 math.asin(0.5) 0.52359877 atan2 x / y的反正切值 math.atan2(90.0,

sql-oracle实现excel中norminv函数功能

问题描述 oracle实现excel中norminv函数功能 如何运用sql实现excel中的norminv函数的功能,求指教 解决方案 在Sharepoint中实现Excel中的NetWorkDays函数功能JAVA 实现下载功能 保存为EXCEL格式自定义Oracle 函数,传入参数,实现简单的功能 解决方案二: http://office.wps.cn/officeexcel/18220-2013-04-10-16-33-40-582.html

helper_string.h中checkCmdLineFlag函数功能以及参数含义

问题描述 helper_string.h中checkCmdLineFlag函数功能以及参数含义 vs中cuda编程时,代码中碰到checkCmdLineFlag(argc, (const char **)argv, "help"),不知道含义,请各位大侠解答. 解决方案 参数就是三个参数,arge和argv代表参数个数和一个带有命令行字符串的二级指针,第三个参数是你要找的字符串(比如"help","device") inline bool che

linux c-关于使用 dup2 函数重定向的一些疑问,望高手解惑~~!!

问题描述 关于使用 dup2 函数重定向的一些疑问,望高手解惑~~!! 先上一段正常的代码,如下: #include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main(){ int oldfd = open("mytest",O_RDWR | O_CREAT,0644);

函数名称 函数功能_ASP基础

函数名称 函数功能Cbool(string) 转换为布尔值Cbyte(string) 转换为字节类型的值Ccur(string) 转换为货币类值Cdate(string) 转换为日前类型的值Cdbl(string) 转换为双精度值Cint(string) 转换为整数值Clng(string) 转换为长整型的值Csng(string) 转换为单精度的值Cstr(var) 转换为字符串值Str(var) 数值转换为字符串Val(string) 字符串转换为数值****** ************

C语言中实现inet_aton和inet_ntoa函数功能

之前遇到过要自己实现inet_aton和inet_ntoa函数功能的问题,这里总结一下. 1 基本知识 网络字节序是大端模式,那么内存中的低地址存放的是数据的高位,内存中的高地址存放的是数据的低位. inet_aton是将IPv4地址(点分法)转换成对应的十进制整数:而inet_ntoa是将十进制整数转换成对应的IPv4地址(点分法). 2 完整代码 #include <stdio.h> #include <ctype.h> #include "print.h"

php实现excel中rank函数功能的方法_php技巧

本文实例讲述了php实现excel中rank函数功能的方法.分享给大家供大家参考.具体分析如下: sql语句实现排名是像这样的如: 总分成绩为 195,180,180,161,名次分别为1,2,3,4,遇到并列的情况也是按照顺序的, 而Excel函数rank排名得到的结果是1,2,2,4,遇到并列跳过中间的3 下面的函数模拟的就是这种情况 函数如下(不知道有没有更好的实现方法): 公式为: 名次=总人数--比自己小的数的个数-这个分数重复次数+1(加上自己) 得到名次的数组再根据对应的id写入到