分类: C/C++
2009-11-23 21:58:22
#include <unistd.h>
int dup(int filedes);
int dup2(int filedes,int filedes2)
//将标准输入重定向到fd[0]
dup2(fd[0],STDIN_FILENO) :
画个图:
STDIN ---> (maybe tty or whatever)
fd[0] ---> (pipe )
dup2之后
STDIN --->(pipe)
fd[0] ---> (pipe) 同一个pipe
close之后
STDIN -->(pipe)
//将标准输出重定向到fd[1]
dup2(fd[1],STDOUT_FILENO)
画个图:
STDOUT <--- (pipe)
fd[1] <--- (pipe )
dup2之后
fd[1] <---(pipe)
(pipe)<---STDOUT 同一个pipe
close之后
STDOUT <---(pipe)
参考apue里面的说明,可以用filedes2参数指定新描述符的数值,如果filedes2已经打开则先关闭。
这样我们把STDOUT_FILENO当作filedes,这样标准输出就被重定向到filedes的描述符的文件下了。实验代码如下:
#include <unistd.h>
2 #include <stdio.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5 #define FILE_MODE (S_IRUSR |S_IWUSR | S_IXGRP | S_IXOTH)
6 int
7 main(void)
8 {
9 int fd;
10 printf("hello,eelb!!\n");
11 if ((fd = creat("due_txt", FILE_MODE))<0) {
12 perror("creat error");
13 exit(0);
14 }
15 else {
16 dup2(fd,STDOUT_FILENO);
17 printf("hello,ee!!\n");
18 }
19 dup2(STDIN_FILENO,STDOUT_FILENO);
20 printf("after hello\n");
21 exit(0);
23 }
执行结果: 所有向标准输出的内容都被写到文件due_txt中.(而标准输出没内容)
有几点要注意的:
1、首先每一个printf后面都加了\n,因为标准输出一直是行缓冲,就算重定向到文件,我试了还是行缓冲,所以不加换行,那么所有的输出都不会自动flush的。
2、还有把标准输出重新重定向到控制台的时候遇到一个问题,如果三个标准都被重定向了那么咋办。。思考中,我在想如果三个都重定向,是不是会自动关掉,再用open。