Linux系统调用之dup函数(你会用dup函数了吗?)

dup函数详解

  • dup函数简介
    • dup函数示例
    • dup2函数示例

dup函数简介

有时候我们需要把标准输入重定向到一个文件,或者把标准输出重定向到网络连接(比如CGI编程),就可以通过dup()和dup2()实现

dup()和dup2()函数都可以用来复制一个文件描述符,原型为:

int dup(int oldfd);
int dup2(int oldfd,int newfd);

dup函数创建一个新的文件描述符,该新文件描述符和原文件描述符指向相同的文件、管道或者网络连接,并且dup返回的新文件描述符是取系统当前可用的最小整数值,dup2和dup类似,不过它返回的是第一个不小于新文件描述符的整数值,dup和dup2调用失败时都返回-1并设置errno

注意:通过dup或者dup2创建的文件描述符并不继承原文件描述符的属性,比如close-on-exec和non-blocking等

dup函数示例

/*************************************************************************
    > File Name: test.c
    > Author:  WYG
    > Mail:  [email protected] 
    > Created Time: 2020年11月09日 星期一 22时39分36秒
 ************************************************************************/

#include
#include
#include
#include
int main()
{
    int oldfd = open("wyg.txt",O_RDWR | O_CREAT,664);
    if(oldfd < 0)
    {
        perror("open");
    }
    printf("oldfd is : %d\n",oldfd);
    int newfd = dup(oldfd);
    if(newfd < 0)
    {
        perror("dup");
    }
    printf("newfd is : %d\n",newfd);
    char *data = "this is new data";
    write(newfd,data,strlen(data));
    return 0;
}

Linux系统调用之dup函数(你会用dup函数了吗?)_第1张图片
由结果可看出oldfd文件描述符为3,newfd文件描述符为4,而oldfd和newfd都可以对wyg.txt文件进行操作。

复制文件描述符,实质应该理解为:oldfd句柄原本指向wyg.txt的文件描述结构体,dup()指向完毕后,newfd句柄也会指向wyg.txt文件描述结构体。所以说对newfd句柄所指的文件操作,等价于操作wyg.txt文件。

dup2()与dup()的区别在于可以用newfd来指定新描述符数值,若newfd指向的文件已经被打开,会先将其关闭。若newfd等于oldfd,就不关闭newfd,newfd和oldfd共同指向一份文件。

dup2函数示例

/*************************************************************************
    > File Name: test.c
    > Author:  WYG
    > Mail:  [email protected] 
    > Created Time: 2020年11月09日 星期一 22时39分36秒
 ************************************************************************/

#include
#include
#include
#include
int main()
{
    int oldfd = open("wyg.txt",O_RDWR | O_CREAT,664);
    if(oldfd < 0)
    {
        perror("open");
    }
    printf("oldfd is : %d\n",oldfd);
    int newfd = dup2(oldfd , 1);
    if(newfd < 0)
    {
        perror("dup");
    }
    printf("this is new data");
    return 0;
}

Linux系统调用之dup函数(你会用dup函数了吗?)_第2张图片
dup2(oldfd, 1)的意思是,newfd指向oldfd句柄指向的文件描述符结构,即原本是指向标准输出文件描述结构体的1指向了wyg.txt,这样一来,原本输出
到显示器终端的字符串就打印到wyg.txt文件中了,这也是Linux操作系统的重定向实现方法。

你可能感兴趣的:(Linux)