求教fflush()函数

0oo0
求教fflush()函数

想实验下printf的缓冲,于是写了下面一小段代码
[table=95%][tr][td][font=FixedSys][color=#000000][color=#0000CC]#[/color][color=#FF0000]include[/color] [color=#0000CC]<[/color]stdio[color=#0000CC].[/color]h[color=#0000CC]>[/color]
[color=#0000CC]#[/color][color=#FF0000]include[/color] [color=#0000CC]<[/color]stdlib[color=#0000CC].[/color]h[color=#0000CC]>[/color]
[color=#0000CC]#[/color][color=#FF0000]include[/color] [color=#0000CC]<[/color]unistd[color=#0000CC].[/color]h[color=#0000CC]>[/color]
[color=#0000CC]#[/color][color=#FF0000]include[/color] [color=#0000CC]<[/color][color=#FF0000]errno[/color][color=#0000CC].[/color]h[color=#0000CC]>[/color]

[color=#0000FF]int[/color] main [color=#0000CC]([/color][color=#0000FF]int[/color] argc[color=#0000CC],[/color] [color=#0000FF]char[/color][color=#0000CC]*[/color] argv[color=#0000CC][[/color][color=#0000CC]][/color][color=#0000CC])[/color]
[color=#0000CC]{[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]int[/color] pipe_fd[color=#0000CC][[/color]2[color=#0000CC]][/color][color=#0000CC];[/color]

&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]if[/color] [color=#0000CC]([/color][color=#0000CC]-[/color]1 [color=#0000CC]=[/color][color=#0000CC]=[/color] pipe[color=#0000CC]([/color]pipe_fd[color=#0000CC])[/color][color=#0000CC])[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000CC]{[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]printf[/color][color=#0000CC]([/color][color=#FF00FF]"make pipe error!/n"[/color][color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]exit[/color][color=#0000CC]([/color]1[color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000CC]}[/color]

&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]if[/color] [color=#0000CC]([/color][color=#0000CC]-[/color]1 [color=#0000CC]=[/color][color=#0000CC]=[/color] dup2[color=#0000CC]([/color]pipe_fd[color=#0000CC][[/color]0[color=#0000CC]][/color][color=#0000CC],[/color] STDIN_FILENO[color=#0000CC])[/color] [color=#0000CC]|[/color][color=#0000CC]|[/color] [color=#0000CC]-[/color]1 [color=#0000CC]=[/color][color=#0000CC]=[/color] dup2[color=#0000CC]([/color]pipe_fd[color=#0000CC][[/color]1[color=#0000CC]][/color][color=#0000CC],[/color] STDOUT_FILENO[color=#0000CC])[/color][color=#0000CC])[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000CC]{[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]printf[/color][color=#0000CC]([/color][color=#FF00FF]"redirct error!/n"[/color][color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]exit[/color][color=#0000CC]([/color]1[color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000CC]}[/color]

&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]while[/color] [color=#0000CC]([/color][color=#0000CC]([/color][color=#0000CC]-[/color]1 [color=#0000CC]=[/color][color=#0000CC]=[/color] [color=#FF0000]close[/color][color=#0000CC]([/color]pipe_fd[color=#0000CC][[/color]0[color=#0000CC]][/color][color=#0000CC])[/color][color=#0000CC])[/color] [color=#0000CC]&[/color][color=#0000CC]&[/color] [color=#0000CC]([/color][color=#FF0000]errno[/color] [color=#0000CC]=[/color][color=#0000CC]=[/color] EINTR[color=#0000CC])[/color][color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]while[/color] [color=#0000CC]([/color][color=#0000CC]([/color][color=#0000CC]-[/color]1 [color=#0000CC]=[/color][color=#0000CC]=[/color] [color=#FF0000]close[/color][color=#0000CC]([/color]pipe_fd[color=#0000CC][[/color]1[color=#0000CC]][/color][color=#0000CC])[/color][color=#0000CC])[/color] [color=#0000CC]&[/color][color=#0000CC]&[/color] [color=#0000CC]([/color][color=#FF0000]errno[/color] [color=#0000CC]=[/color][color=#0000CC]=[/color] EINTR[color=#0000CC])[/color][color=#0000CC])[/color][color=#0000CC];[/color]

&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]int[/color] i [color=#0000CC]=[/color] 1[color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]int[/color] tmp[color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]for[/color] [color=#0000CC]([/color][color=#0000CC];[/color] i [color=#0000CC]<[/color] 10[color=#0000CC];[/color] i[color=#0000CC]+[/color][color=#0000CC]+[/color][color=#0000CC])[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000CC]{[/color]&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]printf[/color][color=#0000CC]([/color][color=#FF00FF]"%d"[/color][color=#0000CC],[/color] i[color=#0000CC])[/color][color=#0000CC];[/color]&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]fflush[/color][color=#0000CC]([/color][color=#FF0000]stdout[/color][color=#0000CC])[/color][color=#0000CC];[/color] [color=#FF9900]//fflush out to unblock scanf
[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]scanf[/color][color=#0000CC]([/color][color=#FF00FF]"%d"[/color][color=#0000CC],[/color][color=#0000CC]&[/color]tmp[color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]fprintf[/color][color=#0000CC]([/color][color=#FF0000]stderr[/color][color=#0000CC],[/color] [color=#FF00FF]"%d/n"[/color][color=#0000CC],[/color] tmp[color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000CC]}[/color]

&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]return[/color] 1[color=#0000CC];[/color]
[color=#0000CC]}[/color]
[/color][/font][/td][/tr][/table]

但这段代码运行时还是阻塞在了scanf中,为什么呢?

cugb_cat
改成printf("%d/n");

0oo0
我的目的是实验printf的行缓冲
在printf后面,不加"/n"的话,字符应该会缓冲起来,但是为什么printf后面调用了fflush()以后,字符还是照样缓冲起来了呢?

另外,我也实验过,如果用printf("xxxx/n");后面不接fflush()的话,字符照样被缓冲起来了,又是为什么呢?

cugb_cat
[quote]原帖由 [i]0oo0[/i] 于 2008-2-19 21:52 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7980220&ptid=1054510][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
我的目的是实验printf的行缓冲
在printf后面,不加"/n"的话,字符应该会缓冲起来,但是为什么printf后面调用了fflush()以后,字符还是照样缓冲起来了呢?

另外,我也实验过,如果用printf("xxxx/n");后面不 ... [/quote]
重定向到管道后,标准输出就是全缓冲的了,那个/n应该是为scanf准备的,因为scanf遇到/n才算输入结束。

0oo0
了解了!
谢谢BZ!

r2r4
4 more fun

try getchar(), instead of scanf
:)