主要观点:
- 曾写博客讨论“Hello World 中的错误”,许多编程语言默认输出到 stdout 会静默吞错,为此创建维护有该问题及修复示例的 repo。
- 以 C 语言为例给出修复后的 Hello World 代码,但该版本未考虑国际化等问题,且未调用
fsync
,简单命令行程序一般不期望fsync
输出。 - 追溯到网络文件系统(NFS)时代,其设计导致同步 I/O 消息在网络上导致大量等待,引入“异步”模式后写错误会被延迟,最后
write
的错误在close
时报告,而用户空间常不检查close
的错误。 - 对于应用程序是否应检查
close
的错误存在争议,Linux 的close
文档认为应检查,POSIX 的close
文档则称close
操作不必等待 I/O 完成,实际中很多应用程序不检查close
的错误,且检查close
错误还可能导致其他问题。 - 不仅应用程序开发者不知是否需检查
close
错误,还面临复杂问题,或许真正的问题在于系统设计,责任应在使用 NFS 或 FUSE 的人以及 I/O 错误的原因上。 - 如今网络文件系统不像过去那么流行,异步编程更方便的编程语言更受欢迎,难以要求应用程序开发者承担检查
close
错误的所有负担。
关键信息:
- 多种编程语言默认输出错误处理方式有问题及修复示例。
- NFS 时代及异步模式的特点和影响。
- 应用程序对
close
错误检查的争议及相关问题。 - 责任归属的讨论及现状。
重要细节:
- C 语言修复后的 Hello World 代码中通过
fflush
和ferror
检查输出是否成功。 - NFS 异步模式下写错误延迟报告及
close
时报告最后write
的错误。 - POSIX 和 Linux 对
close
的不同文档说明及实际应用情况。 - 检查
close
错误可能导致的如调试工具和 C++库的问题。 - 平台与应用程序在该问题上的僵持及现状。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。