【问题标题】:Why do programs sometimes "skip over" printfs?为什么程序有时会“跳过” printfs?
【发布时间】:2011-09-05 11:37:05
【问题描述】:

我有以下代码:

if (!strcmp(ent_child->d_name, "eeprom")){
    printf("\tread_from_driver: found a match! ");//DEBUG
    get_child_path(child_path, child_path, "eeprom");
    printf("The path is: %s\n", child_path);//DEBUG
    read_eeprom(child_path);
}

这会在某些时候导致段错误(可能是 get_child_path),但第一个 printf 永远不会发生,即使我将代码修复为:

if (!strcmp(ent_child->d_name, "eeprom")){
    while(1)
         printf("\tread_from_driver: found a match! ");//DEBUG
    get_child_path(child_path, child_path, "eeprom");
    printf("The path is: %s\n", child_path);//DEBUG
    read_eeprom(child_path);
}

确实会发生。这是怎么回事?这绝对不是我第一次观察到这种行为。

【问题讨论】:

  • 也许尝试刷新输出?

标签: c segmentation-fault printf


【解决方案1】:

stdout 默认情况下是行缓冲,这意味着只有在发送换行符或显式调用fflush(stdout) 时才会获得更新的输出。

【讨论】:

  • 其实stdout默认是行缓冲还是全缓冲,这取决于它是否是交互式设备。如果您想确保输出在特定时间到达,请始终使用fflush
  • 与其在代码中添加多个ffush(stdout),不如添加一个调用setvbuf(stdout, 0, _IONBF, 0) 来禁用printf() 的缓冲可能更简洁。
【解决方案2】:

在每个printf 的末尾使用\n 以确保刷新输出。否则它会被缓冲而不是立即写入。

【讨论】:

    【解决方案3】:

    只有stderr 没有被缓冲...stdout 被缓冲,因此在缓冲区已满、遇到换行符或您专门刷新流之前,您不一定会看到输出。

    因此,如果您想打印调试消息,请使用 stderr 而不是 stdout

    【讨论】:

      【解决方案4】:

      \n放在第一个printf的末尾,分段错误警告消除最后一个输出行。我真的不能解释,我只知道如果你放一个\n它是写的

      【讨论】:

      • 这没有帮助。这就像在说,“去做吧!”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 2015-10-31
      • 2023-02-06
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      相关资源
      最近更新 更多