文件重定向涉及关键函数:
int dup(fd) - 新建文件描述符,指向 fd 所指向的文件;
int dup2(fd1, fd2) - fd2 指向 fd1 指向的文件,若fd2事先已经指向某文件,会自动断开指向;
举例:
重定向标准输出,到一个指定的文件。
代码:
几个标准文件描述符:
标准输入 0
标准输出 1
标准错误 2
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <sys/types.h> 4 #include <sys/stat.h> 5 #include <fcntl.h> 6 #include <string.h> 7 8 int main(int argc, char **argv) 9 { 10 printf("before file redirect "); // 输出到屏幕 11 char buf[] = "before before "; 12 write(1, buf, strlen(buf)); // 输出到屏幕 13 14 int fd_stdout_bak = dup(1); 15 int fd_file = creat("file.dat", 0777); 16 int fd = dup2(fd_file, 1); // 1 指向 file.dat 17 printf("after file redirect, %s - %s ", argv[0], argv[1]); // 输出到文件 file.dat 18 char buf1[] = "after after "; 19 write(1, buf1, strlen(buf1)); // 输出到文件 file.dat 20 21 dup2(fd_stdout_bak, 1); 22 printf("after restore stdout file "); // 恢复输出到屏幕 23 char buf2[] = "restore restore "; 24 write(1, buf2, strlen(buf2)); // 恢复输出到屏幕 25 26 close(fd_stdout_bak); 27 close(fd_file); 28 29 return 0; 30 }
问题:
在执行标准输出重定向前,一定要先调用 printf 函数,
若不调用此函数,则重定向失败;
原因不明!
总结:
文件描述符是指向打开的文件;
不同的文件描述符可以指向同一个文件;
int close(int fd) 表示断开文件描述符的文件指向;
总之,文件描述符类似指针;