You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我无法将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:24:03