红联Linux门户
Linux帮助

linux编程中printf显示不加换行的缓冲问题

发布时间:2016-08-21 22:32:30来源:linux网站作者:留下的只是回忆
最近在编写linux网络编程时,总是遇到这样的事,程序逻辑没错误,但是程序运行到某个地方就停在那里了,后来才发现在prinrf()中加入换行能正常运行了,如“ printf("123"); ”改成“ printf("123\n"); ”就好了。
 
参考:在学习调试linux的线程测试程序时,发现了一个加换行会实时显示,不加换行则会卡主最后一起显示的情况。一个线程打印1一个线程打印2,间隔着打印。
########################
#include <stdio.h>  
#include <unistd.h>  
#include <stdlib.h>  
#include <pthread.h>  
void *thread_function(void *arg);  
int run_now = 1;  
char message[] = "Hello World";  
int main() {  
int res;  
pthread_t a_thread;  
void *thread_result;  
int print_count1 = 0;  
res = pthread_create(&a_thread, NULL, thread_function, (void *)message);  
if (res != 0) {  
perror("Thread creation failed");  
exit(EXIT_FAILURE);  
}  
while(print_count1++ < 20)   
{  
if (run_now == 1)   
{  
printf("1");  
run_now = 2;  
}  
else {  
sleep(1);  
}  
}  
printf("\nWaiting for thread to finish...\n");  
res = pthread_join(a_thread, &thread_result);  
if (res != 0) {  
perror("Thread join failed");  
exit(EXIT_FAILURE);  
}  
printf("Thread joined");  
exit(EXIT_SUCCESS);  
}  
void *thread_function(void *arg)   
{  
int print_count2 = 0;  
while(print_count2++ < 20)   
{  
if (run_now == 2)   
{
printf("2");  
run_now = 1;  
}  
else {  
sleep(1);  
}  
}  
sleep(3);  
}  
########################
以上只要把printf(“1”);改成printf("1\n");
printf("2")改成printf("2\n");
就好了。
 
解释如下:
printf会把东西送到缓冲区,而如果缓冲区不刷新到话,你便不会在屏幕上看到东西,而能导致缓冲区刷新到情况有这些:
1,强制刷新 标准输出缓存fflush(stdout);
2,放到缓冲区到内容中包含/n /r ;
3,缓冲区已满;
4,需要从缓冲区拿东西到时候,如执行scanf;
 
本文永久更新地址://m.ajphoenix.com/linux/23503.html