我应该为strerror\u r留多大尺寸?

OpenGroup POSIX.1-2001定义了strerror\r,Linux标准基本核心规范3.1也定义了strerror\r。但是我找不到关于错误消息的最大大小的参考。我希望有一些定义可以放在我的代码中,但我找不到

代码必须是线程安全的。这就是为什么使用strerror而不是strerror

有人知道我可以用什么符号吗?我应该自己创造吗


范例

int result=gethostname(p\u buffy,size\u buffy);
int errsv=errno;
如果(结果<0)
{
char-buf[256];
char const*str=strerror_r(errsv,buf,256);
系统日志(日志错误,
gethostname失败;错误号=%d(%s),buf='%s',
呃,
str,
(p_buffy),;
返回errsv;
}

来自文档:

开放式集团基本规范第6期:

错误

如果出现以下情况,strerror_r()函数可能会失败:

  • [ERANGE]通过strerrbuf和buflen向客户提供的存储不足
    包含生成的消息字符串

来源:

glibc-2.7/glibc-2.7/string/strerror.c:41:

字符*
strerror(errnum)
int errnum;
{
...
buf=malloc(1024);

有一个足够大的静态限制可能对所有情况都足够好。
如果确实需要获取整个错误消息,可以使用GNU版本的strerror\u r,也可以使用标准版本
并使用连续较大的缓冲区轮询它,直到得到所需的内容。例如,
您可以使用下面的代码

#包括<errno.h>
#包括<标准高度>
#包括<stdlib.h>
#包括<字符串.h>
/*调用strerror\u r并获取完整的错误消息。为
*包含malloc.Return字符串的整个字符串。调用方必须释放字符串。
*如果malloc失败,则返回NULL。
*/
字符*所有字符(整数n)
{
char*s;
大小;
尺寸=1024;
s=malloc(尺寸);
如果(s==NULL)
返回NULL;
while(strerror_r(n,s,size)=-1和errno==ERANGE){
尺寸*=2;
s=realloc(s,尺寸);
如果(s==NULL)
返回NULL;
}
返回s;
}
int main(int argc,字符**argv)
{
对于(int i=1;i<argc;++i){
int n=atoi(argv[i]);
char*s=所有字符(n);
printf(“[%d]:%s\n”,n,s);
免费的;
}
返回0;
}

发表评论