printf的缓冲机制

 

printf的缓冲机制,printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上。但是,只要看到有\n, 则会立即刷新stdout,因此就马上能够打印。在这个例子中:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

int main(void)

{

    printf("hello");

    if(0==fork())

    {

        printf(" child\n");

        return 0;

    }

    printf(" parent\n");

}

 

运行结果:

hello parent

hello child

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

int main(void)

{

    printf("hello\n");

    if(0==fork())

    {

        printf(" child\n");

        return 0;

    }

    printf(" parent\n");

}

 

运行结果:

hello

 parent

 child

 

1、main函数执行printf(“hello”)后, "hello"仅仅被放到了缓冲里,再运行到fork时,缓冲里面的 hello被子进程继承了,因此在子进程度stdout缓冲里面就也有了"hello"。所以,hello会分别会被父子进程各打印一次。

2、main函数执行printf("hello\n")后,"hello" 被立即打印到了屏幕上(因为有\n),之后fork到的子进程里的stdout缓冲里不会有"hello"内容,因此hello只会被父进程打印一次。

 

补充:

 

  • 当程序处于交互运行方式时,标准输出通常处于行缓冲方式,所以当输出换行符时,上次的结果才会被真正输出。
  • 如果标准输出被定向到一个文件,而标准输出处于全缓冲方式,则当标准I/O清理操作执行时,结果才真正被输出。

 

posted @   眉间  阅读(107)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示