为什么在glibc中'sys_errlist'被弃用?

5
sys_errlist是一个方便的数组,允许获取静态的errno描述。它的替代方法是strerror_r函数,可用于两种混淆不兼容的版本。其中GNU版本返回char *,只要错误已知,就可以从同样的前面提到的数组中获取,否则就从用户提供的缓冲区中获取。标准兼容版的strerror_r返回int,并始终使用用户提供的缓冲区。问题在于,这两个函数尽管语义完全不同,但却共享相同的名称,因此您基本上必须执行相当复杂的#ifdef检查,并根据获得的版本编写两个完全不同的代码版本。除此之外,这两个函数都比sys_errlist更差,因为两者都需要调用者提供“足够大”的缓冲区来容纳描述,即使GNU版本很少使用它,而且两个函数都不允许了解缓冲区的实际大小。如果您选择使用sys_errlist,则只需检查value >= sys_nerr,并且只在这种情况下分配缓冲区,通过snprintfUnknown error %d放在那里即可完成。

鉴于strerror_r是一种可怕、难以理解且效率低下的混乱函数,为什么GNU开发人员会将sys_errlist标记为过时的,从而迫使人们要么使用strerrror_r,要么在每次编译代码时观察到丑陋的警告呢?

1个回答

1

strerror及其相关内容是本地化的。非本地化系统消息的实用性可以有所争议,但glibc的维护者们选择了普遍的方向(Solaris和其他系统)。

然而:sys_errlist已经被弃用了很长时间。它不是一个POSIX接口。一些系统没有它。

进一步阅读:

这个问题已经存在一段时间了,但过去的一些系统没有strerror(请参见Unix不兼容性说明:字符串和内存函数)。


2
这实际上根本没有回答问题。sys_errlist是一个静态数组,完全线程安全。 - Jonathon Reinhart
1
但是使用 sys_errlist 并没有什么不安全的线程问题。 - Jonathon Reinhart
有趣的是,即使现在许多构建仍不支持“新方法”,编译器也会嘟囔着“旧方法”。 - Swift - Friday Pie
而且显然strerror不是线程安全/可重入的(而且,在fork之后它还会出问题) - undefined
这个(非可重入)是由于它被本地化的结果。你可以尝试使用POSIX区域设置来解决它。至于fork - 也许你正在遇到vfork的问题。 - undefined
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接