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;
}