免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3213 | 回复: 13
打印 上一主题 下一主题

如何在从定向stdout后,再恢复? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-22 17:02 |只看该作者 |倒序浏览
如何在从定向stdout后,再恢复?

论坛徽章:
0
2 [报告]
发表于 2007-08-22 17:07 |只看该作者
open终端,再把描述符dup给stdout (1),这样行不?

论坛徽章:
0
3 [报告]
发表于 2007-08-22 17:10 |只看该作者
或者直接close(stdout);,然后在调用open()

论坛徽章:
0
4 [报告]
发表于 2007-08-22 17:37 |只看该作者

麻烦各位给个例子,我都试了n个方法了都不行

麻烦各位给个例子,我都试了n个方法了都不行

论坛徽章:
0
5 [报告]
发表于 2007-08-22 17:50 |只看该作者
你自己的程序是什么样的

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2007-08-22 21:10 |只看该作者
原帖由 lgkingdom 于 2007-8-22 17:37 发表
麻烦各位给个例子,我都试了n个方法了都不行

先保存 stdout 到 stdout1(通过 dup2), 然后重定向, 用完后再把 stdout 重定向到你原来保存的 stdout1.

论坛徽章:
0
7 [报告]
发表于 2007-08-22 21:25 |只看该作者
fclose(stdout)

stdout = fopen("/dev/???","w");

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
8 [报告]
发表于 2007-08-23 00:35 |只看该作者

论坛徽章:
0
9 [报告]
发表于 2007-08-23 11:09 |只看该作者

回复 #8 yecheng_110 的帖子

如果把里面的write改称printf怎么才能写到文件里,我试了sync和fsync清空缓冲区都不行

#define TESTSTR "Hello dup2\n"
#define SIZEOFTESTSTR 11

int main() {
        int     fd3;
        int     s_fd;
        int     n_fd;

        fd3 = open("testdup2.dat", 0666);
        if (fd3 < 0) {
                printf("open error\n");
                exit(-1);
        }

        /* 复制标准输出描述符 */
        s_fd = dup(STDOUT_FILENO);
        if (s_fd < 0) {
                printf("err in dup\n");
        }

        /* 重定向标准输出到文件 */
        n_fd = dup2(fd3, STDOUT_FILENO);
        if (n_fd < 0) {
                printf("err in dup2\n");
        }
        write(STDOUT_FILENO, TESTSTR, SIZEOFTESTSTR);   /* 写入testdup2.dat中 */

        /* 重定向恢复标准输出 */
        if (dup2(s_fd, n_fd) < 0) {
                printf("err in dup2\n");
        }
        write(STDOUT_FILENO, TESTSTR, SIZEOFTESTSTR); /* 输出到屏幕上 */
        return 0;
}
注意这里我在输出数据的时候我是用了不带缓冲的write库函数,如果使用带缓冲区的printf,则最终结果为屏幕上输出两行"Hello dup2",而文件testdup2.dat中为空,原因就是缓冲区作怪,由于最终的目标是屏幕,所以程序最后将缓冲区的内容都输出到屏幕。

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
10 [报告]
发表于 2007-08-23 11:29 |只看该作者
原帖由 lgkingdom 于 2007-8-23 11:09 发表
如果把里面的write改称printf怎么才能写到文件里,我试了sync和fsync清空缓冲区都不行

#define TESTSTR "Hello dup2\n"
#define SIZEOFTESTSTR 11

int main() {
        int     fd3;
        int     ...

fprintf可以写文件
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP