当前位置: 技术问答>linux和unix
printf的底层问题。 希望高手解答。(在线等)
来源: 互联网 发布时间:2015-10-25
本文导语: 我在书上得知:默认情况下,printf()在屏幕输出的时候是行缓冲,而将输出结果重定向到文件的时候就变了全缓冲,请问为什么会是这样? 比如: int main() { printf("%d %dn",getpid(),getppid()); if( fork()==0 ) ...
我在书上得知:默认情况下,printf()在屏幕输出的时候是行缓冲,而将输出结果重定向到文件的时候就变了全缓冲,请问为什么会是这样?
比如:
int main() {
printf("%d %dn",getpid(),getppid());
if( fork()==0 )
printf("%d %dn",getpid(),getppid());
return 0;
}
编译成a.out后,如果直接运行 #./a.out, 结果如下:
20817 20801
20818 1
但是运行 #./a.out >out,然后查看out里的内容,结果如下:
20822 20801
20822 20801
20823 1
所以想问问既然a.out都已经编译好了,为什么重定向后printf的缓存会发生变化,是什么原因引起的。 还有请问一下printf在什么时候全缓冲,什么时候行缓冲? 谢谢了。
比如:
int main() {
printf("%d %dn",getpid(),getppid());
if( fork()==0 )
printf("%d %dn",getpid(),getppid());
return 0;
}
编译成a.out后,如果直接运行 #./a.out, 结果如下:
20817 20801
20818 1
但是运行 #./a.out >out,然后查看out里的内容,结果如下:
20822 20801
20822 20801
20823 1
所以想问问既然a.out都已经编译好了,为什么重定向后printf的缓存会发生变化,是什么原因引起的。 还有请问一下printf在什么时候全缓冲,什么时候行缓冲? 谢谢了。
|
printf到终端设备的属于行缓存,否则属于全缓存,比如你说的输出到文件。
全缓存的话,每fork一个子进程,子进程完全拷贝父进程的数据段,所以在父进程中存在的printf也会被拷贝到子进程,所以在父进程中的printf就会被打印两次。
全缓存的话,每fork一个子进程,子进程完全拷贝父进程的数据段,所以在父进程中存在的printf也会被拷贝到子进程,所以在父进程中的printf就会被打印两次。
|
设置行缓冲.
#include
#include
#include
int
main(void)
{
char buf[BUFSIZ];
pid_t pid;
setvbuf(stdout,(char *)NULL,_IOLBF,0);
printf("%d %dn",getpid(),getppid());
if((pid=fork()) == 0){
printf("%d %dn",getpid(),getppid());
}
return(0);
}
#include
#include
#include
int
main(void)
{
char buf[BUFSIZ];
pid_t pid;
setvbuf(stdout,(char *)NULL,_IOLBF,0);
printf("%d %dn",getpid(),getppid());
if((pid=fork()) == 0){
printf("%d %dn",getpid(),getppid());
}
return(0);
}
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。