【发布时间】:2018-12-05 02:31:54
【问题描述】:
我目前正在编写一个 Linux 内核模块(第一次)。
我正在尝试使用 stat 功能。我知道常规导入在内核代码中不起作用,所以我导入了它们的等价物(这就是我的想法......):
#include <linux/stat.h>
#include <linux/errno.h>
#include <linux/unistd.h>
我没有直接收到有关导入的任何错误,但我收到以下消息:
- 错误:函数“stat”的隐式声明 [-Werror=implicit-function-declaration]
- 错误:“errno”未声明(在此函数中首次使用)
分别对应两行:
int ret = stat(pathname, statbuf);
和
errno = ENOENT;
欢迎任何帮助。
谢谢。
PS:我正在开发 Kali 4.9.0-kali4-amd64,但我正在尝试编写一些通用的东西,它可以在多个版本的 Linux 上运行。
【问题讨论】:
-
如果您正在编写系统调用,那么它应该在错误时返回负错误代码。例如。
return -ENOENT;如果您希望系统调用失败,errno设置为ENOENT。 -
谢谢。但我读到如果出现错误并设置 errno,stat 返回 -1。这就是为什么我试图两者都做。我应该只返回 ENOENT 吗?
-
首先
stat是user-space 系统调用,你应该使用什么我不知道。其次,系统调用应该在错误时返回 negative 错误代码,正如我之前的评论中所解释的。尝试查看一些示例系统调用(如果这是您正在编写的)以了解它们是如何做到的。系统调用和错误处理在内核内部的处理方式与在用户空间的处理方式截然不同。 -
我阅读了 stat 源代码,它完全按照你说的做。谢谢你。我明白了。
标签: c module linux-kernel kernel kernel-module