内核模块中的错误处理

时间:2014-05-10 14:25:29

标签: c linux kernel-module ioctl

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

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

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

    谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

相关问题