gpt4 book ai didi

c - strerror_r 示例

转载 作者:行者123 更新时间:2023-12-03 08:18:22 29 4
gpt4 key购买 nike

我是错误处理的新手;在我的代码中,我需要测试函数的返回值并在发生错误时打印错误描述。
为了保持代码线程安全,我必须使用 strerror_r,但我有一些难以使用的地方。在以下代码中,发生了错误编号 22(ret_setschedparam 为 22)。如何使用 strerror_r 打印错误号 22 的描述,即“无效参数” ?
我认为这个原型(prototype)应该是我需要的正确 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接口(interface),而是一个 GNU 扩展。
你可能想用 -D_GNU_SOURCE 构建你的程序。或添加 #define _GNU_SOURCE 1到您的文件顶部以获取此原型(prototype)而不是标准原型(prototype)。
你也没有调用 strerror_r正确。这个电话:
char *buf_setschedparam;
size_t size_setschedparam = 1024;

... strerror_r(errno, buf_setschedparam, size_setschedparam)
promise strerror_rbuf_setscheparam指向大小为 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));

关于c - strerror_r 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63101684/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com