1、dup()
dup()系统调用会创建文件描述符的一个拷贝:
(1)新生成的文件描述符是进程中最小的未使用的文件描述符,0 、1 、2对应标准输入、标准输出、标准错误输出
(2)如果拷贝成功,那么原始的和拷贝的文件描述符可能会交叉使用
(3)两者都指向同一个打开的文件描述符,因此共享文件偏移量和文件状态标志
语法:
int dup(int oldfd); oldfd: 旧的文件描述符的拷贝被创建
实例如下:
#include<stdio.h>
#include <unistd.h>
#include <fcntl.h>
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;
}
2、dup2()
dup2()系统调用与dup类似,它们之间的基本不同在于dup2()不使用最小的未使用的文件描述符编号,它使用指定的文件描述符编号。
语法:
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()系统调用的小技巧:
因为newfd可以是任何的文件描述符,以下的实例使用了C的标准输出stdout。这能实现把printf语句的输出写到oldfd关联的文件中:
#include<stdlib.h>
#include<unistd.h>
#include<stdio.h>
#include<fcntl.h>
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;
}
printf的输出会写入tricky.txt中