c语言的 dup函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言的 dup函数相关的知识,希望对你有一定的参考价值。

dup得到的文件描述符用手动关闭吗?FILE *fp=fdopen(dup(fd),"w");这样写时用手动关闭dup出来的文件描述符吗?

你可以这样做,但是没有必要。
因为 fd是指向你的打开的文件表项(每个打开的文件都有这么一表项),存在多个fd指向一个表项的情况(如你调用dup2,dup,fcntl),系统采用引用计数的方法,如你有两个fd指向一个文件表现,则计数为2,这样你每次调用close,引用计数减1,减到0是,销毁文件表项以及文件的vnode(inode结构)。即便你不手动关闭文件,进程结束时,系统会自动关闭你打开的文件,所以,试情况而定。有时你可以不必自己close文件。
参考技术A int _dup( int handle ); 为一个已经打开的文件建立第二个句柄。
下面的例子中给已经有句柄的标准输出设备(stdout)建立第二个句柄Monitor ,然后再恢复原来的句柄:
int Monitor; Monitor = _dup(1); ...... _dup2(Monitor,1);
新建的和原有的句柄指的是同一个文件(或设备),该函数不具备关闭文件的功能,因此还需手动关闭。

写一个dup2功能同样的函数,不能调用 fcntl 函数,而且要有出错处理

实现的时候用到系统原来的dup函数

// mydup2.c
// 2015/08/17    Lucifer Zhang    version1.0
// write my own dup2 function
// use dup() function when inplementation

#include <unistd.h> // include dup()
#include <stdio.h>
#include <stdlib.h>

#define OPEN_MAX 256
/*
 * when the descriptor is negative or greater than OPEN_MAX, will make a errro
 * */

int my_dup2(int fd, int newfd);

int main(int argc, char *argv[])
{
    int newfd, return_fd;
    
    if (argc != 2) {
        printf("usage: a.out test.txt\n");
        exit(0);
    }
    printf("Please input the descriptor than you want to set: ");
    scanf("%d", &newfd);

    // open a file
    int fd = open(argv[1], 0);
    if (fd == -1) {
        perror(argv[1]); // print error msg
        exit(0);
    }

    printf("old descriptor is: %d\n", fd);
    return_fd = my_dup2(fd, newfd);
    printf("new descriptor is: %d\n");
    close(fd);
    close(return_fd);

    exit(0);
}

int my_dup2(int fd, int newfd)
{
    int count = 0;
    int fdarry[newfd]; // record opened descriptor

    if (newfd < 0 || newfd > OPEN_MAX) {
        printf("the new descriptor error!\n");
        exit(0);
    }

    // dup() return the lowest-numbered available file descriptor
    if ((fdarry[count] = dup(fd)) == -1) {
        printf("dup() function error!\n");
        exit(0);
    } else { // test old file descriptor if can be used
        close(fdarry[count]);
    }

    // if fd equals newfd, then dup2 returns newfd without closing it
    if (fd == newfd) {
        return fd;
    }

    close(newfd); // close

    // the main implementation
    for (count = 0; count <= newfd; ++count) {
        if ((fdarry[count] = dup(fd)) == -1) {
            printf("dup() funciont error!\n");
            exit(0);
        } else {
            printf("the descriptor is: %d\n", fdarry[count]);
            if (fdarry[count] == newfd) {
                break;
            }
        }
    }

    for (count = 0; count <= newfd; ++count) {
        if (fdarry[count] == newfd) {
            return fdarry[count];
        } else {
            close(fdarry[count]);
        }
    }
}

以上是关于c语言的 dup函数的主要内容,如果未能解决你的问题,请参考以下文章

汇编语言中DA1 DB 04H DUP(3 DUP(2),2 DUP(3))啥意思?

C 语言编程 — fork 进程操作

c语言中num是啥意思

R语言stringr包str_dup函数字符串多次复制实战

基础 IO(细节感拉满)

基础 IO(细节感拉满)