errno 的实现
💡
原文中文,约3000字,阅读约需8分钟。
📝
内容提要
在 POSIX 中,errno 被定义为可修改的左值宏,以支持线程安全。FreeBSD 通过函数指针实现 errno,单线程时使用全局变量,线程安全时则返回各线程独立的存储。
🎯
关键要点
- POSIX 中 errno 被定义为可修改的左值宏,以支持线程安全。
- 早期 POSIX 规定 errno 为外部变量,导致线程不安全。
- POSIX Issue 6 删除了外部变量要求,允许实现者支持线程安全的 errno。
- ISO C 标准在 C90/C89 时期不再要求 errno 为外部变量。
- FreeBSD 中 errno 的实现通过函数指针实现,支持线程独立存储。
- errno 宏调用 __error() 函数获取 int * 指针,确保每个线程有独立的 errno 存储。
- libthr 通过构造函数和弱符号引用机制实现线程安全的 errno。
- 线程安全版本的 errno 访问函数 __error_threaded 根据当前线程返回独立的错误存储。
- 初始线程使用全局 __libsys_errno,以确保在线程库初始化之前可用。
➡️