我正在阅读wc命令的源代码,并在main
函数中找到以下代码:
/* Line buffer stdout to ensure lines are written atomically and immediately
so that processes running in parallel do not intersperse their output. */
setvbuf (stdout, NULL, _IOLBF, 0);
那么为什么行缓冲区标准输出可以确保呢?
说块缓冲用于标准输出,而不是行缓冲。(例如,如果stdout指向常规文件,则为默认设置。)令缓冲区大小为1024字节(以便每1024字节将输出刷新到文件中),并假设两个进程正在写入同一文件。
假设第一个进程当前在其I / O缓冲区中有1020个字节,并将该行写入"foo_file 37\n"
stdout。这将放置"foo_"
在I / O缓冲区的末尾,将缓冲区刷新到文件(因为缓冲区现在已满),然后放置"file 37\n"
在缓冲区的开头。假设接着出现第二个进程并刷新其缓冲区,该缓冲区恰巧以开头"bar_file 48\n"
。然后"foo_bar_file 48"
,输出文件中的结果行将是,这显然不是我们想要的。
基本问题是,在使用块缓冲时,缓冲区边界不一定与行边界相对应。
您可以尝试将以下程序的两个实例写入同一文件,以亲自观察这种效果:
#include <stdio.h>
int main(void) {
setvbuf (stdout, NULL, _IOLBF, 0);
for (;;)
puts("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
return 0;
}
随着setvbuf()
呼叫注释掉,你会看到一些线得到混合与其他线路。请注意,当然,这将使程序快速写入一个大文件。:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句