理解dup和dup2
August 25, 2021dup声明
int dup(int fd);
dup返回的文件描述符指向fd的文件表项, 这样有两个描述符指向同一个文件表项。 一般用于备份重定向前的fd指向的文件表项,可用于后面恢复重定向前的状态. 一般与dup2配合使用.
dup2的声明
int dup2(int fd1, int fd2);
dup2 从字面上理解其实就是把 fd1指向的文件表项复制给了fd2,这样fd2也就都指向了fd1,但是这样理解有点绕,只是描述了行为本身,没有说清楚目的
.
一句话说就是将对fd2的操作重定向到fd1 返回不出错的话,则时返回fd2的值,主要用于后面恢复重定向前状态.
典型的场景:
1
2
3
4
5
6
7
8
9
FILE* f; //这里的f也可以是管道等其他文件
int fd_backup = dup(STDOUT_FILENO);
int fd = dup2(f,STDOUT_FILENO); //这里的fd如果不是-1,返回值是第二个参数中的fd值,用于后面恢复到重定向前状态
// 此时对STDOUT的操作重定向到 f
// 恢复重定向前的状态
dup2(fd_backup, fd);