linux-print-n

转载: linux下printf中\n的重要作用

原文链接:http://blog.sina.com.cn/s/blog_563f0ca801000bfe.html 作者:George

linux下printf中\n的重要作用

今天遇到一个很有趣的问题: 我用的是linux 2.6.11 程序大概是这样的(参数不详写了):

1    printf("abc");
2    listen(...);
3    accept(...);

程序死活打不出"abc"来.用gdb查看,程序又确实是运行到了accept这里。

有大虾告诉我:在abc末尾加\n试试。

加了以后,abc就打出来了。

后来又试了类似的:

1    printf("abc");
2    recvfrom(...);
3    //程序一样打不出abc来,
4    printf("abc\n");
5    recvfrom(...);
6    //abc就打出来了.

大虾说linux下printf是以"行"来做缓冲区来刷新stdout的,如果遇到\n会强制立即刷新。否则刷新可能会延迟。因为printf中没有包含\n,内核决定满一行再刷新,而此时程序由于调用accept或recvfrom这类会block的api函数,造成屏幕一直显示不出来,除非收到了tcp连接请求或数据包,系统才会重新决定是否刷新屏幕。

看来小小的\n还是蛮重要的。此问题可以在<<UNIX网络编程 第2版 第2卷进程间通信>>里找到一些相关知识。多了解了解文件I/O还是很有必要的。