C strerror\r示例
我是一个处理错误的新手;在我的代码中,我需要测试函数的返回值,并在发生错误时打印错误描述 为了保证代码的线程安全,我必须使用strerror\r,但我有一些困难。在以下代码中,出现错误号22(ret_setschedparam为22)。如何使用打印错误号22的描述,即“无效参数” 我认为这个原型应该是我需要的合适的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); #包括 #包括 #包括 #包括 #包括 #包
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?)。更正。