dup和dup2用法小結


今天和同學探討了一下關於重定向輸出到文件的問題,其中需要用到dup和dup2函數,因此來小小的總結一下。

首先來man一下:

dup直接返回一個新的描述符和原來的描述符一樣代表同一個資源,描述符的值就從當前未使用的最小的描述符來取。
而dup2則是可以指定描述符的值,這樣通過把文件的描述符指定為STDOUT_FILENO,這樣就相當於重定向輸出為文件了。

所以有以下程序:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#define file_name "dup_test_file"
int main(int argc, char *argv[])
{
    //先調用dup將標准輸出拷貝一份,指向真正的標准輸出
    int stdout_copy_fd = dup(STDOUT_FILENO);
    int file_fd = open(file_name, O_RDWR);
    //讓標准輸出指向文件
    dup2(file_fd, STDOUT_FILENO);
    printf("hello\n");
    //恢復標准輸出
    dup2(stdout_copy_fd, STDOUT_FILENO);
    printf("world\n");
    return 0;
}

然而,調用的兩次printf仍然出現在屏幕上。。hello並沒有寫入到文件中。
原因是:
第一次printf之后,這些字符串還在緩存中,然而之后將標准輸出改回來之后,和再調用printf同時也把之前緩存也輸出了,所以給人的感覺上是沒有重定向成功。所以得加上這么一句

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#define file_name "dup_test_file"
int main(int argc, char *argv[])
{
    //先調用dup將標准輸出拷貝一份,指向真正的標准輸出
    int stdout_copy_fd = dup(STDOUT_FILENO);
    int file_fd = open(file_name, O_RDWR);
    //讓標准輸出指向文件
    dup2(file_fd, STDOUT_FILENO);
    printf("hello\n");
    //刷新緩沖區
    fflush(stdout);
    //恢復標准輸出
    dup2(stdout_copy_fd, STDOUT_FILENO);
    printf("world\n");
    return 0;
}

此時只會輸出world,同時hello寫入到文件中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM