Linux errno(3) 的奇怪限制:成功调用也可能修改 errno

2025-07-04

Linux 的 errno(3) 手册页揭示了一个奇怪的限制:即使函数调用成功,errno 也可能被修改,且系统调用或库函数永远不会将 errno 设置为零。这源于 Unix 系统的传统设计,系统调用通常只在失败时返回 errno,成功时则不修改 errno。C 库函数可能调用多个系统调用,其中一些调用可能失败而不影响库函数本身的成功,导致 errno 保持失败时的值。ANSI C 和 POSIX 继承了这一行为,只要求在函数失败且文档说明会设置 errno 时,errno 的值才有意义。

开发 errno