我目前正在为Linux内核构建一个模块。我的工作版本是3.8-rc3 +。我的工作使我执行一些ioctl()
命令。如你所知,我的命令应该返回一个合适的错误代码来描述执行过程中出错的地方。这看起来很简单,但我有一个用例,我不知道应该返回哪个错误代码。我应该使用哪个错误值?
基本上,我希望用户能够为给定设备设置加密密钥。我的模块将密钥存储在R-B树中,由设备唯一标识符(一个基本的int
)索引。如果“目标”设备在树中已经有一个条目,那么这个条目应该被更新,否则,模块只是用请求的加密密钥向该设备的树添加新分配的条目。
- 东西模块内部可能使用用户想要更新密钥:模块返回
EBUSY
错误试图设置键这就是说,多件事情可能会发生。 - 没有输入和分配失败:
ENOMEM
错误。 - 该模块正在释放其资源。现有的密钥条目可能被标记为删除(该条目有一个标记为
dying
的信号):在内部,我当前使用EPERM
错误代码,因为调用者没有“权限”来在其被销毁时更改条目。
正如我所说的,对于后一种情况,我用EPERM
错误代码,但它是错的我有一种感觉,我不知道哪个错误代码,我应该使用用于这一目的。欢迎任何建议!
我还指定了linux标记,因为ioctl()
可以在用户空间应用程序中使用。
编辑:通过评论和答案看了之后,我想我会这样说:
- 当模块释放其资源,
ESHUTDOWN
将被退回。 - 当只有目标密钥被销毁时,其余的 树仍然健全,将使用
EACCES
。
你大概可以使用任何, 的#define的EACCES 13/*权限被拒绝* /#定义 14 EFAULT/*错误地址* /#定义 EBUSY 16/*设备或资源忙*/ – 2013-03-05 09:00:42
@KinjalPatel我不能如果我想区分使用案例1和使用案例3,则使用'EBUSY'。'EFAULT'不适用,因为该命令具有良好的参数,并且不会发生段错误。 'EACCES'可以做到这一点,但我也有感觉这不是它最初的目的。我对吗 ? – Rerito 2013-03-05 09:09:17
是的,EACCES通常用于用户权限。但在你的情况下,我认为它合适 – 2013-03-05 09:21:32