C GNU strerror\r缓冲区含义

C GNU strerror\r缓冲区含义,c,glibc,strerror,C,Glibc,Strerror,这些buf/buflen参数用于什么 空缓冲区就像一个符咒: 此外,此缓冲区看起来未使用: 引用我的重点 特定于GNU的strerror\r()返回一个指针,指向包含错误消息的字符串这可能是指向函数存储在buf中的字符串的指针,也可能是指向某个(不可变)静态字符串的指针(在这种情况下,buf未使用)。 因此,buf很可能未被使用,如果,buf未被使用,buflen不重要 [..]如果函数在buf中存储字符串,则最多存储buflen字节(如果buflen太小且errnum未知,则字符串可能会被截断

这些
buf
/
buflen
参数用于什么

空缓冲区就像一个符咒: 此外,此缓冲区看起来未使用: 引用我的重点

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

因此,
buf
很可能未被使用,如果,
buf
未被使用,
buflen
不重要

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


正如您在评论中注意到的,bufbuflen参数仅在传递无效的errnum、负值或未知的errno值时使用。这一点得到了国际社会的证实

char*
__strerror\u r(int errnum,char*buf,size\u t buflen)
{
如果(|内置|预期(errnum<0 | | errnum>=|系统|内部
||_sys_errlist_internal[errnum]==NULL,0))
{
/*用“未知错误”本地化字符串填充buf并附加
errnum的数字。如果buflen等于零,则不会发生任何事情*/
...
返回buf;
}
返回(char*)(系统错误列表内部[errnum]);
}
就缓冲区的容量而言,我认为1024字节就足够了。而且,它的大小与strerror实现使用的大小完全相同(这是线程不安全的)。另见


当然,这一切都与GNU版本的函数有关。XSI兼容版本始终使用此缓冲区复制静态字符串。

那么,它是否仅用于
未知错误errno
消息?我仍然可以使用返回值来访问它,对吗?它可能只在需要时使用。
\u r
后缀通常意味着可重入,因此可能在存在线程的情况下会使用它。我的意思是“it used”(已使用)的
缓冲内存,而不是
strerror\u r
线程的存在不会改变任何东西:。我只想知道:是否有任何缓冲区使用的消息长度超过了
未知错误%int%
,或者我可以使用
char buf[30]
来不截断任何内容?你能指出,为什么32字节是不够的吗<代码>“未知错误%d”
永远不会超过它。。。哦,关键是
本地化字符串
。在其他地区可能需要更长的时间。我说的对吗?是的。例如,如果您设置了俄语语言环境,则该字符串将被翻译为
“Быззаааааааааааааа107。此外,还要添加11个符号(int的最小值至少包含10位数字和减号,但_strerror_r为此保留20个字符)。
char *strerror_r(int errnum, char *buf, size_t 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
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]);
}