Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1042998
  • 博文数量: 297
  • 博客积分: 11721
  • 博客等级: 上将
  • 技术积分: 3431
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-25 10:21
文章分类

全部博文(297)

文章存档

2016年(9)

2011年(71)

2010年(137)

2009年(80)

分类: 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。

阅读(794) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~