【问题标题】:LKM Implicit declaration of function statLKM 函数 stat 的隐式声明
【发布时间】: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 吗?
  • 首先statuser-space 系统调用,你应该使用什么我不知道。其次,系统调用应该在错误时返回 negative 错误代码,正如我之前的评论中所解释的。尝试查看一些示例系统调用(如果这是您正在编写的)以了解它们是如何做到的。系统调用和错误处理在内核内部的处理方式与在用户空间的处理方式截然不同。
  • 我阅读了 stat 源代码,它完全按照你说的做。谢谢你。我明白了。

标签: c module linux-kernel kernel kernel-module


【解决方案1】:

首先,您很可能不想想要统计,无论实现是什么。在最坏的情况下,您应该具有“结构文件”对象或直接指向您感兴趣的文件的 dentry 的指针。然后在不太可能的情况下,您需要获取 stat 提供的信息,您可以使用适当的例程它需要文件或目录。然后,您可以继续对已有指针的文件进行操作。只是执行 stat 然后决定做什么通常是一个安全或可靠性问题:到你例如决定打开目标路径,它可以是一个完全不同的文件 - 有人可能已经删除了在您调用统计信息时存在的文件并种植了一个新文件。这是标准错误类的一部分:Time Of Check Time Of Use。

其次,内核中没有“errno”变量,您尝试使用它的事实强烈表明您是一个非常初级的程序员。出于这个原因,我怀疑你应该暂时不要玩内核。

您可能还想阅读这篇论文:http://www.watson.org/~robert/2007woot/2007usenixwoot-exploitingconcurrency.pdf

那么,你到底想实现什么?

【讨论】:

    猜你喜欢
    • 2021-01-20
    • 1970-01-01
    • 2014-06-28
    • 2022-01-16
    • 2011-10-05
    • 2013-10-28
    • 2019-07-16
    • 2017-07-16
    相关资源
    最近更新 更多