在其中一门课程中,我正在学习Linux内核。我知道C库在错误时返回-1
,并将errno
变量设置为实际错误。下面是讲稿,上面写着同样的内容。
我的问题是,为什么C库不能直接返回返回代码而不是返回-1
Note:这个问题可能与this one重复。但是参考问题回答,我的问题更多的是与为什么有关。
发布于 2020-06-03 18:15:05
摘要:C本身并不知道到底出了什么问题,它只是知道出了什么问题。因此,为了维护通用标准,它只返回-1作为通知调用者错误发生的信号,现在由调用方检查errno到底是什么。
简要解释:,原因是内核返回的所有errno都在内核本身中定义。
C只是一种通用编程语言,它从内核接收errno并根据它设置变量并返回-1作为指示错误或失败的信号。所以C语言本身并不知道到底出了什么问题,它只是从内核的注册错误处理程序那里接收到一个错误发生的信号,然后这个错误处理程序提供了实际的错误代码。
因此,为了保持泛型性质,C只是返回-1。这在其他场景中很有用,假设您将C用于其他目的,比如嵌入式系统开发。现在,有几个错误代码与Linux内核错误代码不同。那么,如果嵌入式系统出现问题,C如何知道返回哪些错误代码呢?
答案是C实际上不知道出了什么问题。系统的注册错误处理程序将向您的C程序发送错误信号,并给出相应的错误代码,C将返回-1并设置errno。
现在,为什么C不能返回Errno:的答案是维护通用设计。这使得C开发人员不太关心错误信号的返回类型。如果您正确地解释了C程序返回的-1,那么C程序返回的只是调用C程序的userland或shell脚本的一个通用信号,如果调用C程序的人需要知道到底出了什么问题,他们可以检查errno变量。
发布于 2020-06-03 11:34:52
我认为有一些可能的原因。
首先,这种设计在C/C++中是正常的,我们得到了一个成功/失败的返回,如果你想得到详细的错误信息,你可以得到它。这使得返回更多的统一的,并成为一种正常的使用方式。更重要的是,也许有一段时间你只需要检查一个函数是否工作,你就不需要得到答案。
第二,这可能是历史遗留下来的设计。C/C++有很多旧的设计,我们仍然保留它们的原因是因为更改的成本太大,如果我们不改变它,我们就不会有任何错误。
我不确定我的答案是完全正确的,它们只是一些可能的原因,可能对你有帮助。
https://stackoverflow.com/questions/62154841
复制相似问题