gpt4 book ai didi

c - 我应该使用哪个错误值?

转载 作者:IT王子 更新时间:2023-10-29 00:07:39 24 4
gpt4 key购买 nike

我目前正在为 Linux 内核构建一个模块。我的工作版本是 3.8-rc3+。我的工作让我实现了一些 ioctl() 命令。如您所知,我的命令应该返回一个适当的错误代码来描述执行过程中出了什么问题。这看起来很简单,但我有一个用例,我无法弄清楚应该返回哪个错误代码。

基本上,我希望用户能够为给定设备设置加密 key 。我的模块将键存储在 R-B 树中,由设备唯一标识符(基本 int)索引。如果“目标”设备在树中已有一个条目,则应更新该条目,否则,模块只需将新分配的条目添加到该设备的树中,并带有请求的加密 key 。也就是说,尝试设置 key 时可能会发生多种情况:

  • 模块内部的某些东西可能正在使用用户想要更新的加密 key :模块返回 EBUSY 错误。
  • 没有条目,分配失败:ENOMEM 错误。
  • 模块正在释放它的资源。现有的键条目可能被标记为删除(该条目有一个 dying 标志来表示这一点):我目前在内部使用 EPERM 错误代码,因为调用者没有“允许”在条目被销毁时更改条目。

正如我所说,对于后一种情况,我使用了 EPERM 错误代码,但我感觉这是错误的,而且我不知道为此目的应该使用哪个错误代码。欢迎任何建议!

我还指定了 linux 标记,因为 ioctl() 可以在用户空间应用程序中使用。

编辑:阅读评论和答案后,我想我会这样做:

  • 当模块释放其资源时,将返回ESHUTDOWN
  • 当只有目标键被销毁时,其余的树仍然正常,将使用 EACCES

最佳答案

ESHUTDOWN 怎么样? (传输端点关闭后无法发送)

另一个选项是ENXIO(没有这样的设备或地址)。它不是 100% 准确,因为设备仍然存在,但它传达了错误的含义(它不再可用)。

一个简单的选择是 ENOTSUP(不支持操作)但这听起来更像是“方法未实现”

EPERM 听起来更好,但它通常用于“您没有权限/权利执行此操作”而不是“您现在不能执行此操作”。

ESTALE(陈旧的文件句柄)会很好,但它与 NFS 相关。

关于c - 我应该使用哪个错误值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15219064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com