dup和dup2函数都是复制文件描述符的函数,其会将目标文件描述符的文件表项复制给一个其他的文件描述符。
简而言之,dup等函数可以一个已经打开的文件描述符表项复制给另一个文件描述符中,即可以通过两个不同的文件描述符来操控同一个文件。
函数形式:
int dup(int oldfd);成功返回目标文件的描述符,失败则返回-1.如int fd2 = dup(fd); fd2则会得到一个新的文件描述符,而且可以和fd一起操控同一个文件。
在使用之后也需要将两个文件描述符关闭:
close(fd);
close(fd2);
int dup2(int oldfd, int newfd); 成功则返回目标文件描述符,失败返回-1.oldfd 为源文件的描述符, newfd为目标文件描述符。其在运行时,会先检查newfd是否存在,如果存在,则会先关闭newfd,后将其复制给后者。如果空闲,则直接复制。
实例代码如下:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
int main(void) {
int fd1 = open("dup.txt", O_RDWR | O_CREAT |
O_TRUNC, 0644);
if (fd1 == -1) {
perror("open");
return -1;
}
printf("fd1 = %d\n", fd1);
int fd2 = dup(fd1);
if (fd2 == -1) {
perror("dup");
return -1;
}
printf("fd2 = %d\n", fd2);
int fd3 = dup2(fd2, 100);
if (fd3 == -1) {
perror("dup2");
return -1;
}
printf("fd3 = %d\n", fd3);
const char* text = "Hello, World!";
if (write(fd1, text, strlen(text) * sizeof(
text[0])) == -1) {
perror("write");
return -1;
}
if (lseek(fd2, -6, SEEK_CUR) == -1) {
perror("lseek");
return -1;
}
text = "Linux";
if (write(fd3, text, strlen(text) * sizeof(
text[0])) == -1) {
perror("write");
return -1;
}
close(fd3);
close(fd2);
close(fd1);
return 0;
}