为什么“行缓冲区标准输出以确保自动原子地写行”

xuzhezhao

我正在阅读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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

清除缓冲区标准输入

来自分类Dev

为什么标准输出缓冲?

来自分类Dev

C程序中的非规范终端模式缓冲区标准输出

来自分类Dev

为什么/何时自动清空cout缓冲区?

来自分类Dev

为什么位缓冲区和缓冲区给我不同的输出?

来自分类Dev

用户级别的fs io跳出缓冲区?为什么写文件缓冲区的地址空间应该对齐?

来自分类Dev

读取标准模式下的标准输出从无缓冲更改为行缓冲

来自分类Dev

输出缓冲区是否自动刷新?

来自分类Dev

输出缓冲区是否自动刷新?

来自分类Dev

当系统内存大于8GB时,为什么Linux禁用磁盘写缓冲区?

来自分类Dev

为什么我们在mips中使用写缓冲区?[cache]

来自分类Dev

当一行中有外键时,如何自动原子写两行?

来自分类Dev

为什么stdbuf行不缓冲某些简单C程序的输出

来自分类Dev

为什么拥有多个后备缓冲区会更好地提高性能?

来自分类Dev

将子标准输出捕获到缓冲区

来自分类Dev

为什么刚创建输出缓冲区时需要刷新它?

来自分类Dev

为什么在每次使用printf时都不必刷新输出缓冲区?

来自分类Dev

为什么代码点火器将视图的输出保存在缓冲区中

来自分类Dev

如何在C ++中用新行输出一个缓冲区

来自分类Dev

为什么C没有像strcpy()这样使用函数并自动检查缓冲区大小以防止缓冲区溢出错误?

来自分类Dev

为什么C没有像strcpy()这样使用函数并自动检查缓冲区大小以防止缓冲区溢出错误?

来自分类Dev

误解Unix中的行缓冲区

来自分类Dev

重定向输出时,为什么调整控制台缓冲区会引发无效的句柄异常?

来自分类Dev

当缓冲区未满时,为什么字节缓冲区会给出缓冲区溢出异常

来自分类Dev

当缓冲区未满时,为什么字节缓冲区会给出缓冲区溢出异常

来自分类Dev

标准输出缓冲问题

来自分类Dev

标准输出缓冲问题

来自分类Dev

为什么从颜色缓冲区而不是位置缓冲区获取顶点位置?

来自分类Dev

为什么在LZW压缩中压缩缓冲区需要大于输入缓冲区?

Related 相关文章

  1. 1

    清除缓冲区标准输入

  2. 2

    为什么标准输出缓冲?

  3. 3

    C程序中的非规范终端模式缓冲区标准输出

  4. 4

    为什么/何时自动清空cout缓冲区?

  5. 5

    为什么位缓冲区和缓冲区给我不同的输出?

  6. 6

    用户级别的fs io跳出缓冲区?为什么写文件缓冲区的地址空间应该对齐?

  7. 7

    读取标准模式下的标准输出从无缓冲更改为行缓冲

  8. 8

    输出缓冲区是否自动刷新?

  9. 9

    输出缓冲区是否自动刷新?

  10. 10

    当系统内存大于8GB时,为什么Linux禁用磁盘写缓冲区?

  11. 11

    为什么我们在mips中使用写缓冲区?[cache]

  12. 12

    当一行中有外键时,如何自动原子写两行?

  13. 13

    为什么stdbuf行不缓冲某些简单C程序的输出

  14. 14

    为什么拥有多个后备缓冲区会更好地提高性能?

  15. 15

    将子标准输出捕获到缓冲区

  16. 16

    为什么刚创建输出缓冲区时需要刷新它?

  17. 17

    为什么在每次使用printf时都不必刷新输出缓冲区?

  18. 18

    为什么代码点火器将视图的输出保存在缓冲区中

  19. 19

    如何在C ++中用新行输出一个缓冲区

  20. 20

    为什么C没有像strcpy()这样使用函数并自动检查缓冲区大小以防止缓冲区溢出错误?

  21. 21

    为什么C没有像strcpy()这样使用函数并自动检查缓冲区大小以防止缓冲区溢出错误?

  22. 22

    误解Unix中的行缓冲区

  23. 23

    重定向输出时,为什么调整控制台缓冲区会引发无效的句柄异常?

  24. 24

    当缓冲区未满时,为什么字节缓冲区会给出缓冲区溢出异常

  25. 25

    当缓冲区未满时,为什么字节缓冲区会给出缓冲区溢出异常

  26. 26

    标准输出缓冲问题

  27. 27

    标准输出缓冲问题

  28. 28

    为什么从颜色缓冲区而不是位置缓冲区获取顶点位置?

  29. 29

    为什么在LZW压缩中压缩缓冲区需要大于输入缓冲区?

热门标签

归档