【问题标题】:Why System Call returns -1 instead of actual error code为什么系统调用返回 -1 而不是实际的错误代码
【发布时间】:2020-06-02 14:52:42
【问题描述】:

我在一门课程中学习了 Linux 内核。我知道 C 库在错误时返回 -1 并将 errno 变量设置为实际错误。下面是讲同样内容的演讲幻灯片。

我的问题是,为什么C库不能直接返回返回码而不是返回-1

注意:这个问题可能与this one 重复。但是引用的问题回答what,我的问题更多地与why有关。

【问题讨论】:

标签: linux-kernel


【解决方案1】:

总结: C 本身并不知道到底出了什么问题,它只知道出了什么问题。因此,为了维护通用标准,它只是返回 -1 作为通知调用者发生错误的信号,现在由调用者来检查 errno 到底是什么。

简要说明: 原因是内核返回的所有errno都是内核自己定义的。

C 只是一种通用编程语言,它从内核接收 errno 并根据它设置变量并返回 -1 作为指示错误或失败的信号。所以 C 语言本身并不知道到底出了什么问题,它只是从内核的已注册错误处理程序中接收到发生了错误的信号,然后这个错误处理程序提供实际的错误代码。

所以为了保持通用性,C 只返回 -1。这在其他场景中很有用,假设您将 C 用于其他目的,例如嵌入式系统开发。现在这里有几个错误代码与Linux内核错误代码不同。那么如果嵌入式系统出现问题,C如何知道返回什么错误代码呢?

答案是 C 实际上并不知道什么是错的。系统已注册的错误处理程序将向您的 C 程序发出信号表明出现问题并为您提供相应的错误代码,C 将返回 -1 并设置错误号。

现在,为什么 C 不能返回 Errno: 答案是保持通用设计。这使得 C 开发人员不必太在意错误信号的返回类型。如果您正确解释它,C 程序返回的 -1 只是一个通用信号,向调用 C 程序的用户区 API 或 shell 脚本发出问题,如果 C 程序的调用者需要知道究竟出了什么问题,他们可以检查增加 errno 变量。

【讨论】:

    【解决方案2】:

    我认为有一些可能的原因。

    首先,这种设计在 C/C++ 中是正常的,我们得到一个成功/失败的返回,如果你想得到详细的错误信息,你可以得到它。这使得返回更加统一,成为一种正常的使用方式。更重要的是,有时你只需要检查一个函数是否有效,你不需要得到答案。

    其次,这可能是保留下来的历史设计。 C/C++ 的老设计有很多,之所以留下来,是因为改的成本太高,不改也不会出错。

    我不确定我的回答是否完全正确,它们只是一些可能的原因,可能会对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-03-25
      • 2022-01-19
      • 1970-01-01
      • 2013-09-30
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      相关资源
      最近更新 更多