Linux C语言printf()函数不加换行符就不能输出打印的内容(fflush(stdout) 刷新缓冲区)
Posted Dontla
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux C语言printf()函数不加换行符就不能输出打印的内容(fflush(stdout) 刷新缓冲区)相关的知识,希望对你有一定的参考价值。
文章目录
如代码,
printf("thread [%d]", *(int*)a);
没有加换行符,结果屏幕打印不出内容
test_join.c
#include <pthread.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
void* func(void* a)
while(1)
printf("thread [%d]", *(int*)a);
sleep(1);
int main()
printf("test start\\n");
int a = 1;
int b = 2;
int c = 3;
pthread_t tid;
pthread_create(&tid, NULL, func, &a);
pthread_create(&tid, NULL, func, &b);
pthread_create(&tid, NULL, func, &c);
while(1)sleep(1);
return 0;
原因:
输出缓冲区的问题:
unix上标准输入输出都是带有缓存的,一般是行缓存。
对于标准输出,需要输出的数据并不是直接输出到终端上,而是首先缓存到某个地方,当遇到行刷新标志或者该缓存已满的情况下,才会把缓存的数据显示到终端设备上。
ANSI C中定义换行符\\n
可以认为是行刷新标志。所以,printf函数没有带\\n是不会自动刷新输出流,直至缓存被填满。
解决方案:
方案1、在printf里加
\\n
方案2、在printf后面调用
fflush(stdout)
函数来刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上 。方案3、使用
setvbuf(stdout,NULL,_IONBF,0);
函数来禁止缓冲区,这样就会直接进行输出。这两个函数都是有关流缓冲区的. 具体使用和说明网上有很多. 我只说一下什么是流缓冲区, 是做什么用的。
操作系统为减少IO操作所以设置了缓冲区。等缓冲区满了再去操作IO,这样是为了提高效率。
我加上换行或者在后面加个fflush(stdout)
都能解决,但是还是加换行好点
gcc test_join.c -lpthread && ./a.out
参考文章:Linux下printf函数不加换行符就不能输出打印的内容
以上是关于Linux C语言printf()函数不加换行符就不能输出打印的内容(fflush(stdout) 刷新缓冲区)的主要内容,如果未能解决你的问题,请参考以下文章