char *strerror_r(int errnum, char *buf, size_t buflen);这些buf/buflen参数是干什么用的?
空缓冲区的功能就像一种魅力:
char* buf = nullptr;
fprintf(stderr, strerror_r(errno, buf, 0));此外,这个缓冲区看起来像未使用的:
char buf[1024];
fprintf(stderr, "%s\n", strerror_r(errno, buf, sizeof buf)); // Correct message here
fprintf(stderr, "%s\n", buf); // Empty发布于 2017-03-06 08:14:12
正如您在注释中所注意到的,只有在传递无效的errnum、负的或未知的errno值时,才会使用buf和buflen参数。函数的源代码证实了这一点。
char *
__strerror_r (int errnum, char *buf, size_t buflen)
{
if (__builtin_expect (errnum < 0 || errnum >= _sys_nerr_internal
|| _sys_errlist_internal[errnum] == NULL, 0))
{
/* To fill up buf with "Unknown error" localized string and to append
digits of errnum. Nothing happens if buflen equals zero. */
...
return buf;
}
return (char *) _(_sys_errlist_internal[errnum]);
}就缓冲区的容量而言,我认为1024字节就足够了。此外,它与strerror实现使用的大小完全相同(即线程不安全)。另见相关的回答和评论。
当然,这一切都是关于GNU版本的函数.与XSI兼容的版本总是使用此缓冲区复制静态字符串.
发布于 2016-12-30 05:45:19
引用手册页的话,强调我的观点
特定于GNU的
strerror_r()返回一个指向包含错误消息的字符串的指针。它可以是指向函数存储在buf**,中的字符串的指针,也可以是指向某些(不可变的)静态字符串_的指针(在这种情况下,_ _buf_ _未使用)_.**
因此,很有可能buf未使用,如果buf未使用,则buflen并不重要。
……如果函数将字符串存储在
buf,中,则最多存储buflen字节(如果buflen太小且errnum未知,则可能截断字符串)。..。
https://stackoverflow.com/questions/41391226
复制相似问题