使用dup2重定向了标准输出后,使用什么方法恢复对终端的输出?? http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=359433&page=

使用dup2重定向了标准输出后,使用什么方法恢复对终端的输出?? [复制链接]
0 0

Rank: 1

帖子
999
主题
83
精华
1
可用积分
536
信誉积分
100
专家积分
0
在线时间
0 小时
注册时间
2003-05-13
最后登录
2007-10-17
论坛徽章:
0
跳转到指定楼层
1[收藏(0)][报告]
  发表于 2004-07-02 16:13:49  | 只看该作者  | 倒序浏览
我有一个程序使用了dup2对标准输出进行了重定向,但处理完后希望将数据输出权重新还给系统,但有什么办法实现这一动作呢??我实验过重新使用dup2但不奏效,请大家指教一下.
 
   

Rank: 1

帖子
817
主题
1
精华
1
可用积分
825
信誉积分
102
专家积分
0
在线时间
0 小时
注册时间
2002-11-19
最后登录
2014-06-24
论坛徽章:
0
2[报告]
  发表于 2004-07-02 16:19:13  | 只看该作者

使用dup2重定向了标准输出后,使用什么方法恢复对终端的输出??

需要在dup2之前先保留原来的文件描述符。
 
   

Rank: 1

帖子
999
主题
83
精华
1
可用积分
536
信誉积分
100
专家积分
0
在线时间
0 小时
注册时间
2003-05-13
最后登录
2007-10-17
论坛徽章:
0
3[报告]
  发表于 2004-07-02 16:38:51  | 只看该作者

使用dup2重定向了标准输出后,使用什么方法恢复对终端的输出??

对我看了一下以前的帖子,保留原先的数据描述符.但还是有些不明白,为什么使用fork时主程序的标准输出被重新定向后,子进程仍然可以使用打开的标准输出描述符,操作系统是如何打开这个描述符,难道操作系统一直保留了标准输出的一个副本,为了分配给每一个进程使用????
  
 
   

Rank: 1

帖子
999
主题
83
精华
1
可用积分
536
信誉积分
100
专家积分
0
在线时间
0 小时
注册时间
2003-05-13
最后登录
2007-10-17
论坛徽章:
0
4[报告]
  发表于 2004-07-02 17:02:19  | 只看该作者

使用dup2重定向了标准输出后,使用什么方法恢复对终端的输出??

给出一个简单的程序给大家,是我刚刚实验的结果
  1. #include <stdio.h>;
  2. #include <unistd.h>;
  3. #include <stdlib.h>;
  4. #include <fcntl.h>;
  5. #include <sys/types.h>;
  6. #include <sys/stat.h>;
  7. #include <string.h>;
  8. #include <strings.h>;

  9. int main()
  10. {
  11.         int sfd = dup(STDOUT_FILENO), testfd;

  12.         printf("sfd = [%d]\n", sfd);

  13.         testfd = open("./temp",O_CREAT | O_RDWR | O_APPEND);
  14.         if (-1 == testfd)
  15.         {
  16.                 printf("open file error.\n");
  17.                 exit(1);
  18.         }

  19.         /* 重定向 */
  20.         if (-1 == dup2(testfd,STDOUT_FILENO) ) {
  21.                 printf("can't redirect fd error\n");
  22.                 exit(1);
  23.         }

  24.         /* 此时向stdout写入应该输出到文件 */
  25.         write(STDOUT_FILENO,"file\n",5);

  26.         /* 恢复stdout */
  27.         if (-1 != dup2(sfd,STDOUT_FILENO) ) {
  28.                 printf("recover fd ok \n");

  29.                 /* 恢复后,写入stdout应该向屏幕输出 */
  30.                 write(STDOUT_FILENO,"stdout\n",7);
  31.         }

  32.         printf("gogogogogogo!\n");
  33.         close(testfd);
  34. }
复制代码

这段程序是以前帖子中一位老兄的程序,我进行了一些修改后,给象我一样的朋友,希望有用.
 
   

Rank: 8Rank: 8

帖子
8710
主题
226
精华
5
可用积分
9231
信誉积分
441
专家积分
20
在线时间
1507 小时
注册时间
2002-08-27
最后登录
2015-04-29
论坛徽章:
0
5[报告]
  发表于 2004-07-03 01:19:03  | 只看该作者

使用dup2重定向了标准输出后,使用什么方法恢复对终端的输出??

重新打开/dev/tty即可
Hold the truth! It's your weapon! -- X-Files
新浪微博:@sched_yield
==
政治立场坐标 0.8
文化立场坐标 0.8
经济立场坐标 0.2
 
   

Rank: 1

帖子
184
主题
10
精华
0
可用积分
356
信誉积分
712
专家积分
0
在线时间
219 小时
注册时间
2012-02-04
最后登录
2015-08-26
论坛徽章:
0
6[报告]
  发表于 2014-04-18 13:31:28  | 只看该作者
回复 4# dysnake 

10年前的好贴呀!!我还以为dup2(STDOUT_FILENO, STDOUT_FILENO);就恢复了呢!!!!结果是没有恢复,导致我关也关不了了。太感谢了!


   
http://blog.csdn.net/kangear
 
   

Rank: 8Rank: 8

帖子
1566
主题
13
精华
0
可用积分
11270
信誉积分
2597
专家积分
0
在线时间
3561 小时
注册时间
2004-05-30
最后登录
2015-09-11
论坛徽章:
13
巨蟹座日期:2013-10-25 10:53:02 2015亚冠之浦和红钻日期:2015-08-06 18:41:41 2015亚冠之卡尔希纳萨夫日期:2015-06-27 01:24:12 2015亚冠之德黑兰石油日期:2015-06-24 11:31:07 程序设计版块每日发帖之星日期:2015-06-13 22:20:00 2015亚冠之北京国安日期:2015-06-10 15:55:35 2015小元宵徽章日期:2015-03-06 15:57:20 2015年迎新春徽章日期:2015-03-04 09:49:03 2015年辞旧岁徽章日期:2015-03-03 16:54:15 技术图书徽章日期:2014-03-22 13:55:36 双鱼座日期:2014-01-23 00:06:54 天蝎座日期:2013-11-06 22:39:03 2015亚冠之阿尔希拉尔日期:2015-09-03 00:30:50
7[报告]
  发表于 2014-04-18 13:38:44  | 只看该作者
……楼上考得一手好古……
Unix is like a wigwam -- no Gates, no Windows, and an Apache inside. 
Unix is very user-friendly. It`s just picky who its friends are.
 
   

Rank: 1

帖子
184
主题
10
精华
0
可用积分
356
信誉积分
712
专家积分
0
在线时间
219 小时
注册时间
2012-02-04
最后登录
2015-08-26
论坛徽章:
0
8[报告]
  发表于 2014-04-19 10:49:22  | 只看该作者
回复 7# windoze 
看您也是在论坛的10年大将,诚然,岁月穿梭。。。


   
http://blog.csdn.net/kangear
 
   

帖子
55
主题
13
精华
0
可用积分
77
信誉积分
173
专家积分
0
在线时间
109 小时
注册时间
2014-07-16
最后登录
2015-08-20
论坛徽章:
1
天蝎座日期:2015-03-09 10:14:22
9[报告]
  发表于 2015-04-25 09:21:05  | 只看该作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值