为什么系统调用 returns -1 而不是实际的错误代码
Why System Call returns -1 instead of actual error code
我在其中一门课程中学习了 Linux 内核。我知道 C 库 returns -1
出错并将 errno
变量设置为实际错误。下面是讲同样事情的讲座幻灯片。
我的问题是,为什么 C 库不能 return return 代码而不是 returning -1
?
注意:这个问题似乎与this one重复。但是参考问题的答案what,我的问题更相关的是why.
我认为有一些可能的原因。
首先,这个设计在C/C++中是正常的,我们得到一个return注释successful/fail,如果你想得到详细的错误信息,你可以得到它。这使得return更加统一,成为一种正常的使用方式。更重要的是,也许有些时候你只需要检查一个功能是否有效,你不需要得到答案。
其次,这可能是保留下来的历史设计。 C/C++有很多老的设计,我们还留着的原因是改的成本太高,不改也不会出错
我不确定我的回答是否完全正确,它们只是一些可能的原因,可能会对您有所帮助。
总结: C本身并不知道到底出了什么问题,它只知道出了什么问题。因此,为了维护通用标准,它只是 returns -1 作为一个信号来通知调用者发生了错误,现在由调用者检查 errno 究竟是什么。
简要说明:
原因是所有来自内核的errno return都是在内核本身定义的。
C 只是一种通用编程语言,它从内核接收 errno 并根据它设置变量,returns -1 作为指示错误或失败的信号。所以 C 语言本身并不知道到底出了什么问题,它只是从内核的注册错误处理程序接收到一个信号,表明发生了一些错误,然后这个错误处理程序提供实际的错误代码。
因此,为了保持通用性质 C 只需 returns -1。这在其他情况下很有用,假设您将 C 用于其他目的,例如嵌入式系统开发。现在这里有几个错误代码与 Linux 内核错误代码不同。那么,如果嵌入式系统出现问题,C 如何知道 return 的错误代码呢?
答案是C实际上不知道哪里出了问题。系统的注册错误处理程序将向您的 C 程序发出信号,表明出现了错误,并为您提供适当的错误代码,C 将 return -1 并设置 errno.
现在,为什么 C return Errno: 答案是保持通用设计。这让 C 开发人员不必太在意错误信号的 return 类型。如果你正确地解释它 -1 return 由 C 程序编辑只是一个通用信号到用户区 API 或 shell 脚本调用 C 程序出现了错误,如果调用者C 程序需要知道到底出了什么问题,他们可以检查 errno 变量。
我在其中一门课程中学习了 Linux 内核。我知道 C 库 returns -1
出错并将 errno
变量设置为实际错误。下面是讲同样事情的讲座幻灯片。
我的问题是,为什么 C 库不能 return return 代码而不是 returning -1
?
注意:这个问题似乎与this one重复。但是参考问题的答案what,我的问题更相关的是why.
我认为有一些可能的原因。
首先,这个设计在C/C++中是正常的,我们得到一个return注释successful/fail,如果你想得到详细的错误信息,你可以得到它。这使得return更加统一,成为一种正常的使用方式。更重要的是,也许有些时候你只需要检查一个功能是否有效,你不需要得到答案。
其次,这可能是保留下来的历史设计。 C/C++有很多老的设计,我们还留着的原因是改的成本太高,不改也不会出错
我不确定我的回答是否完全正确,它们只是一些可能的原因,可能会对您有所帮助。
总结: C本身并不知道到底出了什么问题,它只知道出了什么问题。因此,为了维护通用标准,它只是 returns -1 作为一个信号来通知调用者发生了错误,现在由调用者检查 errno 究竟是什么。
简要说明: 原因是所有来自内核的errno return都是在内核本身定义的。
C 只是一种通用编程语言,它从内核接收 errno 并根据它设置变量,returns -1 作为指示错误或失败的信号。所以 C 语言本身并不知道到底出了什么问题,它只是从内核的注册错误处理程序接收到一个信号,表明发生了一些错误,然后这个错误处理程序提供实际的错误代码。
因此,为了保持通用性质 C 只需 returns -1。这在其他情况下很有用,假设您将 C 用于其他目的,例如嵌入式系统开发。现在这里有几个错误代码与 Linux 内核错误代码不同。那么,如果嵌入式系统出现问题,C 如何知道 return 的错误代码呢?
答案是C实际上不知道哪里出了问题。系统的注册错误处理程序将向您的 C 程序发出信号,表明出现了错误,并为您提供适当的错误代码,C 将 return -1 并设置 errno.
现在,为什么 C return Errno: 答案是保持通用设计。这让 C 开发人员不必太在意错误信号的 return 类型。如果你正确地解释它 -1 return 由 C 程序编辑只是一个通用信号到用户区 API 或 shell 脚本调用 C 程序出现了错误,如果调用者C 程序需要知道到底出了什么问题,他们可以检查 errno 变量。