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基础课程》。