1

是 POSIX,要在设备驱动程序读取函数中返回 errno.h 中列出的任何可用 errno 值,还是应该只使用 read linux 手册页中列出的那些?

编辑:
我正在编写一个设备驱动程序,其中用户必须在调用读取函数之前使用 ioctl cmd 设置一些参数。因此,如果用户在设置这些参数之前尝试调用 read 函数,我正在寻找要返回的正确 errno 值。EPERM“不允许操作”似乎是正确的,但因为它没有在阅读的 linux 手册页中列出,我想知道这是否是一个正确的实现。

4

2 回答 2

2

POSIX 要求使用列出的错误代码来报告相应的错误情况。但是,它也允许将其他错误代码用于未列出的错误。

POSIX.1-2008 第 2 卷中的文本:系统接口,第 2.3 节错误编号:

实现可能支持未包含在此列表中的其他错误,可能会在此处描述的情况以外的情况下生成此列表中包含的错误,或者可能包含防止某些错误发生的扩展或限制。

每个参考页上的 ERRORS 部分指定了所有实现应检测到哪些错误条件(“将失败”),以及可以选择由实现检测哪些错误条件(“可能失败”)。如果未检测到错误条件,则请求的操作应成功。

当且仅当所有这些错误条件始终与本卷 POSIX.1-2008 中描述的错误条件相同时,实现可能会在上述情况下生成此处列出的错误编号。对于本卷 POSIX.1-2008 中描述的错误情况,实现不应生成与本卷 POSIX.1-2008 要求的错误编号不同的错误编号,但可能会产生额外的错误,除非明确禁止特定功能。

于 2012-12-13T17:16:34.660 回答
1

Linux 联机帮助页通常都很好,但它们并不权威。对于这样的问题,你需要去官方标准。您应该只返回POSIX.1-2008 规范中read列出的错误代码之一(向下滚动到显示错误的位置)。如果您返回一些其他代码,应用程序软件将无法处理它并且可能会崩溃。

请注意,其中许多代码只能在为它们描述的条件下返回。例如,您的设备驱动程序没有业务返回EBADF, EISDIR, EOVERFLOW,ESPIPE或任何在其描述中带有“socket”一词的内容,因为在控制到达您之前处理了所有这些是适当故障代码的情况。这可能也是这种情况,EINTR但我不确定。

您还应该知道 Linux 没有实现 POSIX.1-2008 的一些可选功能(最重要的是,假设所有标记为 OB_XSR 的东西根本不存在)并且该标准所做的一些区别已经过时(比如ENOMEMENOBUFS)。

综上所述,除非您的设备驱动程序非常不寻常,否则我希望您只需要EIO, EAGAIN,ENOMEM也许 ENXIO(如果EIO/ENXIO区别对您的硬件有意义)。

于 2012-12-13T15:03:19.463 回答