1. dup2
dup2
的作用是使得 newfd
指向 oldfd
对应的文件,可以实现重定向。
int dup2(int oldfd, int newfd);
关闭newfd
对应的文件描述符,讲newfd
重新指向为oldfd对应的文件
文件描述符实际上是一个句柄,句柄指向一个文件。dup2
的作用是使得 newfd
指向 oldfd
对应的文件。
比如打开一个文件,使用dup2
函数,上图就变成下图了(即原来指向/dev/tty
的1
指向了3
指向的那个文件,3
指向的是一个新打开的文件)
dup2(3,1);
2. dup
返回一个新的、指向oldfd对应文件的 文件描述符,实现复制文件描述符
int dup(int oldfd);
它的作用是复制文件描述符,即如下图所示,执行dup(3)
,则新开的文件描述符4
也指向了3
所指的文件
使用示例
代码中执行2次printf("hello world\n");
,一次输出到hello
文件中,后一次输出到屏幕上
注意:printf
想写到文件里,只是指定文件描述符还不够,还需要刷新一次,否则printf
的东西还保留在缓冲区中。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(){
//先备份现场
int outfd = dup(1);
//打开Word文件,给他写权限,如果没有,则创建文件。
int fd = open("world",O_WRONLY|O_CREAT,0666);
//先做重定向,将标准输出重定向到fd对应的文件
dup2(fd,1);
//printf调用write的时候需要一个刷新机制,否则就写不到Word文件中,而是依然存储在缓冲区
//因此需要用fflush进行刷新。
printf("hello world\n");
//需要来一次刷新下
fflush(stdout);
//需要恢复文件描述符1,使其重新对应标准输出
dup2(outfd,1);
printf("hello world\n");
close(fd);
return 0;
}