我正在编写一个 Unix 系统编程程序,其中一个要求是处理系统调用返回的所有可能的错误。
因此,我不想让一个函数专门针对每个系统调用,而是希望有一个函数来负责这一职责。那么,所有错误号返回都是唯一的吗?如果不是,存在哪些重叠领域?
答案1
有两个方面:系统调用发出错误信号的方式,以及报告发生错误的方式。
大多数系统调用通过返回 -1 来表示发生错误,但这并不完全通用(例如,某些系统调用总是成功,例如getpid
)。
如果您知道发生了错误,则错误代码始终位于errno
¹ 中。有标准值定义于errno.h
,并且每个 UNIX 变体都添加了一些自己的内容。错误代码由名称以E
;开头的常量识别。数值因操作系统而异。这些错误代码是标准的(例如,EACCESS
始终表示“权限被拒绝”,EIO
始终表示“输入/输出错误”,……),但每个错误消息的确切含义取决于系统调用。
标准功能strerror
和perror
提供可以向用户显示的错误消息。
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)
.