C strerror\r示例

C strerror\r示例,c,error-handling,pthreads,strerror,C,Error Handling,Pthreads,Strerror,我是一个处理错误的新手;在我的代码中,我需要测试函数的返回值,并在发生错误时打印错误描述 为了保证代码的线程安全,我必须使用strerror\r,但我有一些困难。在以下代码中,出现错误号22(ret_setschedparam为22)。如何使用打印错误号22的描述,即“无效参数” 我认为这个原型应该是我需要的合适的strerror\r: char *strerror_r(int errnum, char *buf, size_t buflen); #包括 #包括 #包括 #包括 #包括 #包

我是一个处理错误的新手;在我的代码中,我需要测试函数的返回值,并在发生错误时打印错误描述

为了保证代码的线程安全,我必须使用strerror\r,但我有一些困难。在以下代码中,出现错误号22(ret_setschedparam为22)。如何使用打印错误号22的描述,即“无效参数”

我认为这个原型应该是我需要的合适的strerror\r:

char *strerror_r(int errnum, char *buf, size_t buflen);

#包括
#包括
#包括
#包括
#包括
#包括
void*任务();
int main()
{
pthread_attr_t attr;
结构sched_param prio;
pthread_t tid;
内部重新创建;
int ret_setschedparam;
int ret_getschedparam;
int ret_join;
char*buf_setschedparam;
size_t size_setschedparam=1024;
pthread_attr_init(&attr);
优先级为12;
ret_setschedparam=pthread_attr_setschedparam(&attr,&prio);
如果(返回设置参数!=0){
printf(“错误编号(pthread_attr_setschedparam):%s\n”,strerror_r(errno,buf_setschedparam,size_setschedparam));
退出(退出失败);
}
ret_create=pthread_create(&tid,&attr,task,NULL);
printf(“%d%d\n”,重新创建,EPERM);
如果(重新创建!=0){
printf(“错误编号(pthread\u create):%d\n”,ret\u create);
退出(退出失败);
}
ret_getschedparam=pthread_attr_getschedparam(&attr,&prio);
如果(ret_getschedparam!=0){
printf(“错误编号(pthread\u attr\u getschedparam):%d\n”,ret\u getschedparam);
退出(退出失败);
}
printf(“Livello di prioritádel thread:%d\n”,prio.sched_priority);
ret_join=pthread_join(tid,NULL);
如果(重新加入!=0){
printf(“错误编号(pthread\u join):%d\n”,ret\u join);
退出(退出失败);
}
返回(0);
}
void*任务()
{
printf(“我是一个简单的线程。\n”);
pthread_exit(NULL);
}
编译器给了我一个错误:它说strerror\u r的输出是int,而不是char

我认为这个原型应该是我需要的合适的strerro\r:

char *strerror_r(int errnum, char *buf, size_t buflen);
请注意,这不是标准的
strerror\r
接口,而是GNU扩展

您可能希望使用
-D_GNU_SOURCE
构建程序,或者将
#define_GNU_SOURCE 1
添加到文件顶部,以获得此原型,而不是标准原型

您也没有正确调用
strerror\r
。此电话:

char *buf_setschedparam;
size_t size_setschedparam = 1024;

... strerror_r(errno, buf_setschedparam, size_setschedparam)
承诺将
strerror\u r
指向大小为1024的缓冲区。事实上,指针是未初始化的,所以一旦您让程序构建,它将立即崩溃

此外,
pthread.*
函数不设置
errno
,它们直接返回错误代码

你想要:

const size_t size_setschedparam = 1024;
char buf_setschedparam[size_setschedparam];

... sterror_r(ret_setschedparam, buf_setschedparam, size_setschedparam);
或者更好:

char buf[1024];

   ... sterror_r(ret_setschedparam, buf, sizeof(buf));

Hello@EmployedRussian我修改了代码,但printf打印的是“Errore numero(pthread_attr_setschedparam):Success”,而不是“Errore numero(pthread_attr_setschedparam):无效参数”。为什么?
为什么?
因为您将
0
作为第一个参数传递给了
strerror\r
。改为传递无效参数的错误号。我猜您希望传递
pthread\u attr\u setschedparam
函数的返回值。非常感谢@KamilCuk@KamilCuk我错过了第二个bug(一行可以有多少个bug?)。更正。