不用写 C 包装函数,从别的语言里骗出 errno
来源:sebsite.pw — 2026-09-25
📋 概述
errno 是个宏,展开方式不可移植也没有稳定性保证,因此从非 C 语言调用 libc 函数时拿不到错误码,常规做法是写一个返回 errno 的 C 包装函数。作者用 Hare 写了一套相当离谱的方案:程序启动时把 stderr 复制一份、把 STDERR_FILENO 重定向到临时文件,出错时调用 perror 让它把错误描述写进临时文件再读回来,然后用 strerror 预先建好的消息表反查,把字符串还原成具体的 errno 数值。
🔑 核心要点
- 因为 perror 是唯一直接读 errno 的标准函数,整套方案就从它入手
- 初始化时 dup 一份 stderr,再用 dup2 把 fd 2 指向 mkstemp 创建的临时文件
- 必须在启动时就重定向,因为到用之前再调 dup2 会覆盖 errno 本身
- 反查表靠 strerror 预填,但 glibc 的 strerror_r 是 GNU 版本,POSIX 版本藏在 __xpg_strerror_r 里,作者为了不依赖内部符号干脆不用它
- 所有 libc 包装函数出错时都走 get_errno(),统一返回错误字符串或数值
💡 金句
there aren't any libc functions which return the value of errno.
👍 0
👎 0
← 返回 Lobsters 首页