【问题标题】:Error-handling in a kernel module内核模块中的错误处理
【发布时间】:2014-06-28 05:34:24
【问题描述】:

我正在编写一个通过ioctl 与用户应用程序通信的内核模块。通信是单向的——也就是说,在正常情况下不需要输出。我的问题是 - 我应该如何向用户应用程序报告错误?

例如,我的模块接受进程 ID 作为输入。假设 PID 无效。我在errno.h 中没有找到匹配的错误代码,所以我需要另一种报告方式。我可以想到几种方法:

  1. 在公共头文件中定义一个(正)常量INVALID_PID,将-INVALID_PID作为ioctl调用的返回值返回,并在用户应用程序中处理
  2. 将有意义的消息打印到内核日志并返回通用错误代码
  3. ioctl 接收来自用户应用程序的参数 - 我可以将错误消息存储在那里
  4. 与用户应用程序建立一些双向通信

这样做的标准方法是什么?

谢谢!

【问题讨论】:

    标签: c linux kernel-module ioctl


    【解决方案1】:

    通常当ioctls 失败时,他们使用来自include/uapi/asm-generic/errno-base.h 的标准代码。然后为每个特定的ioctl 记录每个错误的含义。

    在您的情况下,您可能希望返回 ENOENTEINVAL。如果您的ioctl 的参数是PID,那么ENOENT 意味着这个PID 不存在就很明显了。你最好在某处记录这种行为。一个很好的例子可以在man console_ioctl找到。

    【讨论】:

    • 谢谢!但是当我需要“自定义”消息时,我仍然不确定该怎么做。也许我的例子过于简单化了。当我有多个参数时,或者当有多个原因认为某个参数无效并且我想告知用户确切的原因时,我应该怎么做?
    • @Benesh 可以解释为什么您需要自定义消息? ioctl 是对内核“执行与此文件描述符相关的操作”的命令,它要么成功,要么失败。当它失败时,它会因为 A、B 或 C 的原因而失败。这就是为什么要重用一组常见错误代码的原因。内核代码通常是简陋的,它不关心返回诸如“糟糕,出现错误,您提供的 PID 是 42 但我们只允许 PID 1、2 和 3”之类的好消息。相反,它说EINVAL,更像是“让你的PID正确!”。
    • fd 仅用于启用通信。我完全有可能滥用它,但我已经看到了一些这种做法的例子。无论如何,我会听从你的建议。再次感谢!
    猜你喜欢
    • 2013-10-15
    • 2012-11-19
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2019-02-17
    相关资源
    最近更新 更多