为什么我无法将errno的数值正确保存到自定义变量中?
问题原因解答
首先需要明确:errno是标准库定义的宏,展开后是线程局部的可修改int左值,将它赋值给int类型的read_errno这个操作本身是完全合法有效的,你并没有在保存这一步失败,出现你观察到的输出现象是以下几个常见问题共同导致的:
- 缺失必要头文件:你调用了
strerror函数但没有引入<string.h>头文件,C语言会对未声明的函数做隐式int返回值假设,会导致指针被截断、参数传递错误等未定义行为,哪怕第一次输出碰巧符合预期,后续调用也可能出现异常。 - 库函数的副作用修改了
errno:printf、strerror都属于标准库函数,部分C标准库实现中,哪怕这类函数执行成功,内部调用的系统调用也可能修改errno的值,不过这个副作用只会修改全局的errno,不会改变你已经赋值给read_errno的局部变量值。 - 伪代码和实际代码的差异:你给出的示例中
read(...)是占位写法,如果你的实际代码在read调用完成和read_errno = errno赋值之间,还调用了其他库函数,这些函数很可能已经把errno的值修改为0,才会导致read_errno最终存的是代表成功的0值。
正确的errno保存示例
#include <stdio.h> #include <errno.h> #include <unistd.h> #include <string.h> // 必须引入strerror对应的头文件 // 标准C的main函数返回值为int,不要使用void main int main(void) { int read_errno; ssize_t read_ret; // 执行read系统调用,替换为你的实际参数 read_ret = read(STDIN_FILENO, NULL, 0); // 系统调用返回后立刻保存errno,中间不要插入任何其他库函数调用 read_errno = errno; // 优先使用已经保存的read_errno做错误处理 printf("保存的错误码数值:%d\n", read_errno); printf("对应的错误信息:%s\n", strerror(read_errno)); return 0; }
内容的提问来源于stack exchange,提问作者LukesDiner
相关产品推荐
相关产品推荐

