📜  dup()和dup2()Linux系统调用

📅  最后修改于: 2021-05-26 00:42:34             🧑  作者: Mango

dup()

dup()系统调用创建文件描述符的副本。

  • 它将编号最小的未使用描述符用于新描述符。
  • 如果成功创建了副本,则原始文件描述符和副本文件描述符可以互换使用。
  • 它们都引用相同的打开文件描述,因此共享文件偏移量和文件状态标志。

句法:

int dup(int oldfd);
oldfd: old file descriptor whose copy is to be created.
// CPP program to illustrate dup() 
#include
#include 
#include 
  
int main()
{
    // open() returns a file descriptor file_desc to a 
    // the file "dup.txt" here"
  
    int file_desc = open("dup.txt", O_WRONLY | O_APPEND);
      
    if(file_desc < 0)
        printf("Error opening the file\n");
      
    // dup() will create the copy of file_desc as the copy_desc
    // then both can be used interchangeably.
  
    int copy_desc = dup(file_desc);
          
    // write() will write the given string into the file
    // referred by the file descriptors
  
    write(copy_desc,"This will be output to the file named dup.txt\n", 46);
          
    write(file_desc,"This will also be output to the file named dup.txt\n", 51);
      
    return 0;
}

请注意,该程序将不会在在线编译器中运行,因为它包括打开文件并在其中写入文件。

说明: open()将文件描述符file_desc返回到名为“ dup.txt”的文件。 file_desc可用于对文件“ dup.txt”执行某些文件操作。使用dup()系统调用之后,将创建file_desc的副本copy_desc。该副本还可以用于对同一文件“ dup.txt”执行某些文件操作。经过两次写操作,一个是使用file_desc,另一个是copy_desc,然后编辑同一文件,即“ dup.txt”。

在运行代码之前,让写操作之前的文件“ dup.txt”如下所示:

运行上面显示的C程序后,文件“ dup.txt”如下所示:

dup2()

dup2()系统调用与dup()类似,但是它们之间的基本区别在于,它使用用户指定的描述符编号,而不是使用编号最小的未使用文件描述符。
句法:

int dup2(int oldfd, int newfd);
oldfd: old file descriptor
newfd new file descriptor which is used by dup2() to create a copy.

要点:

  • 包括用于使用dup()和dup2()系统调用的头文件unistd.h。
  • 如果描述符newfd先前已打开,则在重用之前将其静默关闭。
  • 如果oldfd不是有效的文件描述符,则调用将失败,并且不会关闭newfd。
  • 如果oldfd是有效的文件描述符,并且newfd具有与oldfd相同的值,则dup2()
    什么都没有,并返回newfd。


dup2()系统调用的棘手用法:
与dup2()一样,可以将newfd替换为任何文件描述符。下面是一个C实现,其中使用了标准输出(stdout)的文件描述符。这将导致所有printf()语句被写入旧文件描述符所引用的文件中。

// CPP program to illustrate dup2() 
#include
#include
#include
#include
  
int main()
{
    int file_desc = open("tricky.txt",O_WRONLY | O_APPEND);
      
    // here the newfd is the file descriptor of stdout (i.e. 1)
    dup2(file_desc, 1) ; 
          
    // All the printf statements will be written in the file
    // "tricky.txt"
    printf("I will be printed in the file tricky.txt\n");
      
return 0;
}

如下图所示:
令dup2()操作之前的文件“ tricky.txt”如下所示:

运行上面显示的C程序后,文件“ tricky.txt”如下所示:

参考:dup(2)– Linux手册页

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。