strerror_r 的示例
Example of strerror_r
我是错误处理的新手;在我的代码中,我需要测试函数的返回值,并在发生错误时打印错误的描述。
为了保持代码的线程安全我不得不使用strerror_r,但是我有一些难以使用它。在下面的代码中,错误号为 22(ret_setschedparam 是 22)。如何使用 strerror_r?
打印错误号 22 的描述,即“无效参数”
我觉得这个原型应该是对的strerror_r我需要:
char *strerror_r(int errnum, char *buf, size_t buflen);
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <sched.h>
#include <errno.h>
#include <string.h>
void *task();
int main()
{
pthread_attr_t attr;
struct sched_param prio;
pthread_t tid;
int ret_create;
int ret_setschedparam;
int ret_getschedparam;
int ret_join;
char *buf_setschedparam;
size_t size_setschedparam = 1024;
pthread_attr_init(&attr);
prio.sched_priority = 12;
ret_setschedparam = pthread_attr_setschedparam(&attr, &prio);
if (ret_setschedparam != 0) {
printf("Errore numero (pthread_attr_setschedparam): %s\n", strerror_r(errno, buf_setschedparam, size_setschedparam));
exit(EXIT_FAILURE);
}
ret_create = pthread_create(&tid, &attr, task, NULL);
printf("%d %d\n", ret_create, EPERM);
if (ret_create != 0) {
printf("Errore numero (pthread_create): %d\n", ret_create);
exit(EXIT_FAILURE);
}
ret_getschedparam = pthread_attr_getschedparam(&attr, &prio);
if (ret_getschedparam != 0) {
printf("Errore numero (pthread_attr_getschedparam): %d\n", ret_getschedparam);
exit(EXIT_FAILURE);
}
printf("Livello di priorità del thread: %d\n", prio.sched_priority);
ret_join = pthread_join(tid, NULL);
if (ret_join != 0) {
printf("Errore numero (pthread_join): %d\n", ret_join);
exit(EXIT_FAILURE);
}
return(0);
}
void *task()
{
printf("I am a simple thread.\n");
pthread_exit(NULL);
}
编译器报错:strerror_r的输出是int,不是char。
I think that this prototype should be the right strerro_r I need:
请注意,这不是标准的 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_r
承诺 buf_setscheparam
指向大小为 1024 的缓冲区。事实上,该指针未初始化,因此一旦您构建程序,它就会立即崩溃。
此外,pthread_*
函数不设置errno
,它们直接return错误代码。
你想要:
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));
我是错误处理的新手;在我的代码中,我需要测试函数的返回值,并在发生错误时打印错误的描述。
为了保持代码的线程安全我不得不使用strerror_r,但是我有一些难以使用它。在下面的代码中,错误号为 22(ret_setschedparam 是 22)。如何使用 strerror_r?
打印错误号 22 的描述,即“无效参数”我觉得这个原型应该是对的strerror_r我需要:
char *strerror_r(int errnum, char *buf, size_t buflen);
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <sched.h>
#include <errno.h>
#include <string.h>
void *task();
int main()
{
pthread_attr_t attr;
struct sched_param prio;
pthread_t tid;
int ret_create;
int ret_setschedparam;
int ret_getschedparam;
int ret_join;
char *buf_setschedparam;
size_t size_setschedparam = 1024;
pthread_attr_init(&attr);
prio.sched_priority = 12;
ret_setschedparam = pthread_attr_setschedparam(&attr, &prio);
if (ret_setschedparam != 0) {
printf("Errore numero (pthread_attr_setschedparam): %s\n", strerror_r(errno, buf_setschedparam, size_setschedparam));
exit(EXIT_FAILURE);
}
ret_create = pthread_create(&tid, &attr, task, NULL);
printf("%d %d\n", ret_create, EPERM);
if (ret_create != 0) {
printf("Errore numero (pthread_create): %d\n", ret_create);
exit(EXIT_FAILURE);
}
ret_getschedparam = pthread_attr_getschedparam(&attr, &prio);
if (ret_getschedparam != 0) {
printf("Errore numero (pthread_attr_getschedparam): %d\n", ret_getschedparam);
exit(EXIT_FAILURE);
}
printf("Livello di priorità del thread: %d\n", prio.sched_priority);
ret_join = pthread_join(tid, NULL);
if (ret_join != 0) {
printf("Errore numero (pthread_join): %d\n", ret_join);
exit(EXIT_FAILURE);
}
return(0);
}
void *task()
{
printf("I am a simple thread.\n");
pthread_exit(NULL);
}
编译器报错:strerror_r的输出是int,不是char。
I think that this prototype should be the right strerro_r I need:
请注意,这不是标准的 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_r
承诺 buf_setscheparam
指向大小为 1024 的缓冲区。事实上,该指针未初始化,因此一旦您构建程序,它就会立即崩溃。
此外,pthread_*
函数不设置errno
,它们直接return错误代码。
你想要:
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));