免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9924 | 回复: 8

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

论坛徽章:
0
发表于 2004-07-02 16:13 |显示全部楼层
我有一个程序使用了dup2对标准输出进行了重定向,但处理完后希望将数据输出权重新还给系统,但有什么办法实现这一动作呢??我实验过重新使用dup2但不奏效,请大家指教一下.

论坛徽章:
0
发表于 2004-07-02 16:19 |显示全部楼层

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

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

论坛徽章:
0
发表于 2004-07-02 16:38 |显示全部楼层

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

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

论坛徽章:
0
发表于 2004-07-02 17:02 |显示全部楼层

使用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. }
复制代码

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

论坛徽章:
0
发表于 2004-07-03 01:19 |显示全部楼层

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

重新打开/dev/tty即可

论坛徽章:
0
发表于 2014-04-18 13:31 |显示全部楼层
回复 4# dysnake

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


   

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2014-04-18 13:38 |显示全部楼层
……楼上考得一手好古……

论坛徽章:
0
发表于 2014-04-19 10:49 |显示全部楼层
回复 7# windoze
看您也是在论坛的10年大将,诚然,岁月穿梭。。。


   

论坛徽章:
1
天蝎座
日期:2015-03-09 10:14:22
发表于 2015-04-25 09:21 |显示全部楼层
我也是来考古的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP