【问题标题】:syscall error handling inside the linux kernellinux内核中的系统调用错误处理
【发布时间】:2010-08-23 16:39:16
【问题描述】:

我正在 linux 内核中编写一个新的系统调用。我想实现一个错误处理系统,以向使用 sycall 的用户返回描述错误类型的代码。我想知道这是如何在内核中完成的,因为我想遵循标准。我想让用户阅读 errno 变量或等效的东西,以了解发生的错误。 谢谢。

附:我正在使用可用的最新版本的 linux。

【问题讨论】:

    标签: error-handling linux-kernel errno


    【解决方案1】:

    您的大部分任务都由 libc 和低级内核系统调用处理程序(用汇编语言编写的部分)自动处理。处理错误代码的内核约定是返回一个负错误常量,例如-ENOMEM。零或正数表示成功。这在整个内核中都使用。

    如果您定义了新的 sycall 入口点 static asmlinkage long my_new_syscall (int param) {...},则只需返回 -ENOMEM(或类似名称)。如果您使用 libc 的 syscall(nr, param) 调用系统调用,那么在出错时它将返回 -1 并且 ENOMEM(正数)将在 errno 中。

    include/asm-generic/{errno,errno-base}.h 中定义了许多您可以使用的错误代码(如ENOMEM)。如果这些都不符合您的目的,您可以将自己的错误编号添加到这些文件中,但请注意,您还需要修改用户空间可见的内核标头以显示相同的编号,因此会更加困难设置系统以使用您的修改。如果没有必要,请不要这样做。

    【讨论】:

      【解决方案2】:

      我发现我可以通过在 sycall 中返回代码本身来简单地返回我希望设置 errno 的代码的编号。其余的都是由 linux 内核自动完成的。

      【讨论】:

        【解决方案3】:

        您有两种选择:使用现有的错误代码,或定义您自己的错误代码。大多数情况下,我发现现有的错误代码与我想要的含义非常接近。

        基本错误编号位于:

        include/asm-generic/errno-base.h

        include/asm-generic/errno.h.

        在您的系统调用中,您可以将现有 errno 值的负值返回给您的用户。例如:

        return -ENOMEM;
        

        【讨论】:

          猜你喜欢
          • 2010-09-20
          • 1970-01-01
          • 2018-12-15
          • 2018-04-04
          • 2012-01-07
          • 2012-11-18
          • 1970-01-01
          • 1970-01-01
          • 2013-07-13
          相关资源
          最近更新 更多