GNU strerror_r缓冲区含义

时间:2016-12-30 05:42:42

标签: c glibc strerror

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

2 个答案:

答案 0 :(得分:3)

引用man page强调我的

  

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

因此buf很可能未被使用,如果buf未使用,则buflen无关紧要。

  

[....] 如果函数在buf 中存储字符串,则最多存储buflen个字节(如果{{1,则字符串可能会被截断) }}太小而buflen未知)。 [...]

答案 1 :(得分:1)

正如您在评论中注意到的,仅当您传递无效 errnum ,否定或未知错误时,才会使用 buf buflen 参数价值。这由the source code of the function确认。

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 实现使用的完全相同的大小(该线程不安全)。另请参阅the related answer and the comment to it

当然,这一切都与GNU版本的功能有关。符合XSI的版本始终使用此缓冲区来复制静态字符串。