linux内核中的系统调用错误处理

时间:2010-08-23 16:39:17

标签: error-handling linux-kernel errno

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

P.S。我正在使用最新的linux版本。

3 个答案:

答案 0 :(得分:11)

你的大部分任务都是由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)。如果这些都不符合您的目的,您可以将自己的错误编号添加到这些文件中,但请注意,您还需要修改用户空间可见的内核头文件以显示相同的编号,这样会更加困难设置系统以使用您的修改。如果你不需要,不要这样做。

答案 1 :(得分:2)

我发现我可以通过在sycall中返回代码本身来简单地返回我想要设置的代码的数量。其余全部由Linux内核自动完成。

答案 2 :(得分:1)

您有两种选择:使用现有的错误代码,或定义您自己的错误代码。大多数时候我发现现有的错误代码足够接近我想要的含义。

基本错误编号可在以下位置找到:

include/asm-generic/errno-base.h

include/asm-generic/errno.h

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

return -ENOMEM;
相关问题