- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是错误处理的新手;在我的代码中,我需要测试函数的返回值并在发生错误时打印错误描述。
为了保持代码线程安全,我必须使用 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_r
那
buf_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/
我是错误处理的新手;在我的代码中,我需要测试函数的返回值并在发生错误时打印错误描述。 为了保持代码线程安全,我必须使用 strerror_r,但我有一些难以使用的地方。在以下代码中,发生了错误编号 2
这段代码安全吗: strerror_r(errcode,buffer,length); printf("Error: %s",buffer); 也就是说,如果缓冲区太小,我可以相信缓冲区是空终止的吗?
这是一个说明问题的简单程序。 #include #include int main () { char buf [30]; strerror_r (0, buf, sizeof (
OpenGroup POSIX.1-2001 定义 strerror_r , The Linux Standard Base Core Specification 3.1 也是如此.但是我找不到对错误
char *strerror_r(int errnum, char *buf, size_t buflen); 这些 buf/buflen 参数有什么用? 空缓冲区就像一个魅力: char* buf
我在这样的代码中为线程安全的 strerror_r 提供了一个 C++ 包装器: struct MyErrno {}; std::ostream& operator<<(std::stream& os
我在 Linux 中使用 libc 中的 strerror_r 函数。我用 0 作为缓冲区指针和缓冲区大小参数来调用它,它返回一个指向带有错误消息的字符串的指针。 我复制了一个字符串以供将来使用,但是
Android ndk-9c 似乎与 strerror_r 声明的标准相矛盾。 Linux 手册页显示 strerror_r 声明如下: int strerror_r(int errnum, char
VxWorks 提供了一个只接受两个参数的 strerror_r 版本。 STATUS strerror_r ( int errcode, /* error number */ cha
在测试期间,我有一个模拟对象,它设置了 errno = ETIMEDOUT; 我正在测试的对象看到错误并调用 strerror_r取回错误字符串: if (ret) { if (ret ==
我看到 strerror_r (...) Visual C++ 2008 不再支持 API,可能是因为线程安全问题。我想在我的程序中使用类似的功能。是否有任何其他 winapi 与 strerror_
我正在使用 strerror_r在日志记录辅助函数中。如手册页所述,此函数有两个版本。 POSIX 版本返回一个 int。 GNU 版本返回一个字符串 (char*)。 因此,为了让我的 C++ 代码
我如何获得 POSIX strerror_r而不是 GNU 版本? 我正在 Ubuntu 8.04 上使用 g++ 和 glibc 版本 2.7(基于中的内容)进行编译。 编辑 在上面的手册页上说:
这是我的程序。 #include #include #include #include int main() { char errbuf[256]; errno
我有一个 C 程序,它在 Linux 下编译和运行良好,没有任何警告,但是当试图在 SunOS 上编译它时,我收到以下警告: test.c: In function `my_function': te
在构建 OpenSSL-1.1.0d 时出现以下错误。 ./libcrypto.a(o_str.o):o_str.c:(.text+0x5cb): undefined reference to `st
我是一名优秀的程序员,十分优秀!