dup2和dup函數

dup2和dup函數

在這裏插入圖片描述

1. dup2

dup2的作用是使得 newfd 指向 oldfd 對應的文件,可以實現重定向。

 int dup2(int oldfd, int newfd);

關閉newfd對應的文件描述符,講newfd重新指向爲oldfd對應的文件
文件描述符實際上是一個句柄,句柄指向一個文件。dup2的作用是使得 newfd 指向 oldfd 對應的文件。

比如打開一個文件,使用dup2函數,上圖就變成下圖了(即原來指向/dev/tty1指向了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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章