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) 刷新缓冲区)的主要内容,如果未能解决你的问题,请参考以下文章

c语言中,puts和printf函数有啥区别?

c语言中 在编辑窗口,如果printf函数内字符过长,想要在编辑窗口换行,而且编译时不出问题,怎么办?

c++ 语句 cout<<endl

c语言中printf的用法

Linux_069_awk格式化输出

C语言 用printf总出错