我目前正在为Linux内核构建一个模块。我的工作版本是3.8-rc3 +。我的工作引导我实现一些ioctl()
命令。如您所知,我的命令应该返回一个适当的错误代码来描述执行过程中出错的地方。这看起来很简单,但我有一个用例,我无法弄清楚应该返回哪个错误代码。
基本上,我希望用户能够为给定设备设置加密密钥。我的模块将密钥存储在R-B树中,由设备唯一标识符(基本int
)索引。如果“目标”设备已经在树中具有条目,则应该更新该条目,否则,模块仅使用所请求的加密密钥将新分配的条目添加到该设备的树。也就是说,尝试设置密钥时会发生多种情况:
EBUSY
错误。ENOMEM
错误。dying
标志以表示此信号):内部我当前使用EPERM
错误代码,因为调用者没有“权限”来更改条目正在被摧毁。正如我所说,对于后一种情况,我使用EPERM
错误代码,但我感觉这是错误的,我不知道我应该为此目的使用哪个错误代码。欢迎任何建议!
我还指定了linux标记,因为ioctl()
可以在用户空间应用程序中使用。
编辑:在阅读了评论和答案之后,我想我会这样做:
ESHUTDOWN
。EACCES
将被使用。答案 0 :(得分:3)
ESHUTDOWN
怎么样? (传输端点关闭后无法发送)
另一个选项是ENXIO
(没有此类设备或地址)。它不是100%准确,因为设备仍在那里,但它传达了错误的含义(它不再可用)。
一个简单的选择是ENOTSUP
(不支持操作)但听起来更像是“未实施的方法”
EPERM
听起来更好,但它通常用于“你没有这样做的权限/权利”,而不是“你现在不能这样做”。
ESTALE
(过时的文件句柄)会很好,但它与NFS有关。