原帖由 "kj501" 发表:
如果要把输出重定向回来,就应该在重定向前先保存stdout,然后在重定向完成之后,再把保存的stdout用dup2()恢复回来。
原帖由 "flyingbxf" 发表:
怎么个保存法?压栈?还是用另外的指针指向STDOUT?
原帖由 "flyingbxf"]alhost bxf 发表:
#为什么关掉文件后,还能把The end写进去?运行结果如下:
[root@localhost bxf]# ./a.out
[root@localhost bxf]# cat /var/log/ftp
have a test
The end!
原帖由 "kj501" 发表:
int saved_fd ;
saved_fd = STDOUT_FILENO; /* 保存标准输出 */
dup2(saved_fd, STDOUT_FILENO); /* 恢复标准输出 */
原帖由 "converse" 发表:
dup2(id, STDOUT_FILENO);
printf("world\n"
return 0;
原帖由 "converse" 发表:
我明白了,fflush函数把原来的test和hello强行写入打开的文件中,然后由于stdut被重新定位到屏幕上所以就在屏幕上输出world了,对吧??
我现在比较的郁闷,虽然找了一个作LINUX的公司,不过作的东西好象和我想像..........
原帖由 "flyingbxf" 发表:
quote]
我没有加fflush (stdout); 也没有出现问题啊!为什么呢?我是在linux下运行的。
原帖由 "win_hate" 发表:
你写错了吧?这几行程序一般相当于:
int saved_fd;
save_fd = 2;
dup2 (2, 2);
这怎么行?
原帖由 "kj501" 发表:
int saved_fd ;
saved_fd = STDOUT_FILENO; /* 保存标准输出 */
dup2(saved_fd, STDOUT_FILENO); /* 恢复标准输出 */
原帖由 "kj501" 发表:
说错了,stdout应该是1,2是stderr。
原帖由 "kj501" 发表:
dup2函数执行时肯定会失败。
但从代码中也可以看出,我前面提出的先保存文件描述符,然后在重定向之后再恢复回来的思路是行得能的。
有不当之处,还请大家多多指教!
原帖由 "win_hate" 发表:
我记得你是做嵌入式开发的,可能是环境不同。你换个台式机试一试可能就有这个问题。
原帖由 "converse" 发表:
fflush(stdout);//刷新stdout上的缓冲区,这样前面的hello写入文件 install.log中
dup2(id, STDOUT_FILENO);
printf("world\n"
fclose(fp);
原帖由 "converse" 发表:
不过这里对fflush(stdout)的运用还有一点疑问,fflush(stream)刷新的是流 stream上的缓冲,是不是可以理解为不论文件描述符STDOUT_FILENO定位到了哪个文件,stdout都保存有未写入文件的缓冲区的内容呢?按理来说,文件描述符比流更加底层才对呀
原帖由 "win_hate" 发表:
注释掉,然后,很重要的一点,把 sfd 初始化为一个整数, 不要太大。我估计程序不会出错。
你试过后,请把结果告诉我。谢谢。
原帖由 "win_hate" 发表:
呵呵, 确实如此。 事实上,文件指针,比如说fp, 是根据fileno(fp)来对应文件的。你看上面的代码,STDOUT_FILENO 已经对应到 install.log,所以,当fflush(stdout)后, 缓冲内容写入文件 install.log。如果不fflus..........
原帖由 "Wangwen" 发表:
可以理解为 dup2首先close标准输出,然后把标准输出的文件描述符STDOUT_FILENO 传到fd所代表的fp文件指针结构中
STDOUT_FILENO 指向install.log的文件表
文件指针stdout的文件描述符为STDOUT_FILENO
所以f..........
原帖由 "converse" 发表:
fflush(stream)刷新的是流stream上的缓冲,是不是可以理解为不论文件描述符STDOUT_FILENO定位到了哪个文件,stdout都保存有未写入文件的缓冲区的内容呢?........
原帖由 "flyingbxf" 发表:
不用fflush(stream)就写不进文件,但为什么不用fflush(stream)就能输出到屏幕上呢?
原帖由 "Wangwen" 发表:
可以理解为 dup2首先close标准输出,
将STDOUT_FILENO 指向install.log的文件表
文件指针stdout的文件描述符为STDOUT_FILENO
所以fflush(stdout)后, 缓冲内容写入文件 install.log
使用fprintf(fp,"hello\n"fflush(fp);仍然可以将hello写入install.log
dup2(id, STDOUT_FILENO)使STDOUT_FILENO指向标准输出
printf("world\n"写入终端
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |