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;
}