首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNU strerror_r缓冲区含义

GNU strerror_r缓冲区含义
EN

Stack Overflow用户
提问于 2016-12-30 05:42:42
回答 2查看 818关注 0票数 2
代码语言:javascript
复制
char *strerror_r(int errnum, char *buf, size_t buflen);

这些buf/buflen参数是干什么用的?

空缓冲区的功能就像一种魅力:

代码语言:javascript
复制
char* buf = nullptr;
fprintf(stderr, strerror_r(errno, buf, 0));

此外,这个缓冲区看起来像未使用的:

代码语言:javascript
复制
char buf[1024];
fprintf(stderr, "%s\n", strerror_r(errno, buf, sizeof buf)); // Correct message here
fprintf(stderr, "%s\n", buf); // Empty
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-06 08:14:12

正如您在注释中所注意到的,只有在传递无效的errnum、负的或未知的errno值时,才会使用bufbuflen参数。函数的源代码证实了这一点。

代码语言:javascript
复制
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兼容的版本总是使用此缓冲区复制静态字符串.

票数 1
EN

Stack Overflow用户

发布于 2016-12-30 05:45:19

引用手册页的话,强调我的观点

特定于GNU的strerror_r()返回一个指向包含错误消息的字符串的指针。它可以是指向函数存储在buf**,中的字符串的指针,也可以是指向某些(不可变的)静态字符串_的指针(在这种情况下,_ _buf_ _未使用)_.**

因此,很有可能buf未使用,如果buf未使用,则buflen并不重要。

……如果函数将字符串存储在buf,中,则最多存储buflen字节(如果buflen太小且errnum未知,则可能截断字符串)。..。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41391226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档