avatar
请问如何恢复正常的IO?# Programming - 葵花宝典
B*s
1
我用dup2把程序的stdout指向了一个文件,那么我该如何使程序的stdout重新指回显示
器? thanks.
avatar
k*f
2
把原来的stdout保存下来
最后给恢复一下。

【在 B********s 的大作中提到】
: 我用dup2把程序的stdout指向了一个文件,那么我该如何使程序的stdout重新指回显示
: 器? thanks.

avatar
B*s
3
帮忙看看这段代码为什么不能把输出重定向到屏幕?
int main()
{
int fdout;
fdout = open("a",O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
dup2(fdout,STDOUT_FILENO);
printf("hehe\n");
dup2(1,STDOUT_FILENO);
printf("haha\n");
return 0;
}

【在 k****f 的大作中提到】
: 把原来的stdout保存下来
: 最后给恢复一下。

avatar
k*f
4
换stdout的时候,需要fflush的。把之前的东西刷出去。
从来没有用过open/dup2
我就是用:fopen造个FILE*
FILE*old_stdout=stdout
stdout=那个FILE*
blahblah....
fflush(stdout);
stdout=old_stdout;

【在 B********s 的大作中提到】
: 帮忙看看这段代码为什么不能把输出重定向到屏幕?
: int main()
: {
: int fdout;
: fdout = open("a",O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
: dup2(fdout,STDOUT_FILENO);
: printf("hehe\n");
: dup2(1,STDOUT_FILENO);
: printf("haha\n");
: return 0;

avatar
t*t
5
他这段问题不在这里(因为stdout缺省是line buffered)
我假设他STDOUT_FILENO=1
那么他作的是
dup2(fdout, 1)
...
dup2(1,1)
...
这就好象写:
a1=a_fdout;
// use a1 as a_fdout
a1=a1;
// trying to recover previous a1
这显然不make sense...

【在 k****f 的大作中提到】
: 换stdout的时候,需要fflush的。把之前的东西刷出去。
: 从来没有用过open/dup2
: 我就是用:fopen造个FILE*
: FILE*old_stdout=stdout
: stdout=那个FILE*
: blahblah....
: fflush(stdout);
: stdout=old_stdout;

avatar
B*s
6
那么应该怎么写呢?

【在 t****t 的大作中提到】
: 他这段问题不在这里(因为stdout缺省是line buffered)
: 我假设他STDOUT_FILENO=1
: 那么他作的是
: dup2(fdout, 1)
: ...
: dup2(1,1)
: ...
: 这就好象写:
: a1=a_fdout;
: // use a1 as a_fdout

avatar
t*t
7
对了,你这个办法不太安全
理论上来说stdout不一定是lvalue,正确的做法是用freopen.当然,freopen就把原来的
给关了.

【在 k****f 的大作中提到】
: 换stdout的时候,需要fflush的。把之前的东西刷出去。
: 从来没有用过open/dup2
: 我就是用:fopen造个FILE*
: FILE*old_stdout=stdout
: stdout=那个FILE*
: blahblah....
: fflush(stdout);
: stdout=old_stdout;

avatar
c*x
8
Things look more complicated than they appears,
The call:
fid = dup2(fildes, fildes2);
is equivalent to:
close(fildes2);
fid = fcntl(fildes, F_DUPFD, fildes2);
When you "dup2(fdout,STDOUT_FILENO);" you close the stdout, no way
you can use 1 to reopen it.
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。