所有系统调用错误号都是唯一的吗?

所有系统调用错误号都是唯一的吗?

我正在编写一个 Unix 系统编程程序,其中一个要求是处理系统调用返回的所有可能的错误。

因此,我不想让一个函数专门针对每个系统调用,而是希望有一个函数来负责这一职责。那么,所有错误号返回都是唯一的吗?如果不是,存在哪些重叠领域?

答案1

有两个方面:系统调用发出错误信号的方式,以及报告发生错误的方式。

大多数系统调用通过返回 -1 来表示发生错误,但这并不完全通用(例如,某些系统调用总是成功,例如getpid)。

如果您知道发生了错误,则错误代码始终位于errno¹ 中。有标准值定义于errno.h,并且每个 UNIX 变体都添加了一些自己的内容。错误代码由名称以E;开头的常量识别。数值因操作系统而异。这些错误代码是标准的(例如,EACCESS始终表示“权限被拒绝”,EIO始终表示“输入/输出错误”,……),但每个错误消息的确切含义取决于系统调用。

标准功能strerrorperror提供可以向用户显示的错误消息。

1 请注意,如果在上次系统调用或 C 库函数调用期间没有发生错误,errno则可能包含垃圾。

答案2

我所知道的唯一重叠之处是历史上 AT&T 和 BSD 派生的 Unix 之间存在差异的领域的同义词。例如,AT&T Unix'sEAGAIN与 BSD's 含义相同EWOULDBLOCK,因此它们在定义两者的系统上具有相同的值。

答案3

errno.h不,给定系统上不应有重叠。检查您的errno.h(最有可能在 /usr/include 下的某处)是否有以 E 开头的定义,如 inENOENT等,并制定switch()处理每种情况的语句。然后您可以针对所有系统调用错误调用您自己的函数。

(听起来很像你正在实施perror(3).

相关内容