是 POSIX,要在设备驱动程序读取函数中返回 errno.h 中列出的任何可用 errno 值,还是应该只使用 read linux 手册页中列出的那些?
编辑:
我正在编写一个设备驱动程序,其中用户必须在调用读取函数之前使用 ioctl cmd 设置一些参数。因此,如果用户在设置这些参数之前尝试调用 read 函数,我正在寻找要返回的正确 errno 值。EPERM“不允许操作”似乎是正确的,但因为它没有在阅读的 linux 手册页中列出,我想知道这是否是一个正确的实现。
是 POSIX,要在设备驱动程序读取函数中返回 errno.h 中列出的任何可用 errno 值,还是应该只使用 read linux 手册页中列出的那些?
编辑:
我正在编写一个设备驱动程序,其中用户必须在调用读取函数之前使用 ioctl cmd 设置一些参数。因此,如果用户在设置这些参数之前尝试调用 read 函数,我正在寻找要返回的正确 errno 值。EPERM“不允许操作”似乎是正确的,但因为它没有在阅读的 linux 手册页中列出,我想知道这是否是一个正确的实现。
POSIX 要求使用列出的错误代码来报告相应的错误情况。但是,它也允许将其他错误代码用于未列出的错误。
POSIX.1-2008 第 2 卷中的文本:系统接口,第 2.3 节错误编号:
实现可能支持未包含在此列表中的其他错误,可能会在此处描述的情况以外的情况下生成此列表中包含的错误,或者可能包含防止某些错误发生的扩展或限制。
每个参考页上的 ERRORS 部分指定了所有实现应检测到哪些错误条件(“将失败”),以及可以选择由实现检测哪些错误条件(“可能失败”)。如果未检测到错误条件,则请求的操作应成功。
当且仅当所有这些错误条件始终与本卷 POSIX.1-2008 中描述的错误条件相同时,实现可能会在上述情况下生成此处列出的错误编号。对于本卷 POSIX.1-2008 中描述的错误情况,实现不应生成与本卷 POSIX.1-2008 要求的错误编号不同的错误编号,但可能会产生额外的错误,除非明确禁止特定功能。
Linux 联机帮助页通常都很好,但它们并不权威。对于这样的问题,你需要去官方标准。您应该只返回POSIX.1-2008 规范中read
列出的错误代码之一(向下滚动到显示错误的位置)。如果您返回一些其他代码,应用程序软件将无法处理它并且可能会崩溃。
请注意,其中许多代码只能在为它们描述的条件下返回。例如,您的设备驱动程序没有业务返回EBADF
, EISDIR
, EOVERFLOW
,ESPIPE
或任何在其描述中带有“socket”一词的内容,因为在控制到达您之前处理了所有这些是适当故障代码的情况。这可能也是这种情况,EINTR
但我不确定。
您还应该知道 Linux 没有实现 POSIX.1-2008 的一些可选功能(最重要的是,假设所有标记为 OB_XSR 的东西根本不存在)并且该标准所做的一些区别已经过时(比如ENOMEM
对ENOBUFS
)。
综上所述,除非您的设备驱动程序非常不寻常,否则我希望您只需要EIO
, EAGAIN
,ENOMEM
和也许 ENXIO
(如果EIO
/ENXIO
区别对您的硬件有意义)。