今天和同學探討了一下關於重定向輸出到文件的問題,其中需要用到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寫入到文件中