【问题标题】:Programmatically check whether a linux kernel module exists or not at runtime在运行时以编程方式检查 linux 内核模块是否存在
【发布时间】:2012-10-10 08:04:17
【问题描述】:

我正在编写一个 C 守护程序,它依赖于两个内核模块的存在来完成它的工作。该程序不直接使用这些(或任何其他)模块。它只需要它们存在。 因此,我想以编程方式检查这些模块是否已经加载,以便在运行时警告用户。

在我开始做解析/proc/moduleslsmod 输出之类的事情之前,某个实用程序函数是否已经存在? 类似is_module_loaded(const char* name);

我很确定以前有人问过这个问题。 但是,我认为我缺少正确的搜索词。

【问题讨论】:

    标签: c kernel-module system-calls


    【解决方案1】:

    没有这样的功能。事实上,lsmod (lsmod.c) 的源代码中包含以下行,应该会引导您找到解决方案:

    file = fopen("/proc/modules", "r");
    

    还有一个已弃用的query_module,但它现在似乎只存在于内核头文件中。

    【讨论】:

    • 我的问题很模棱两可,既要求存在这样的功能,又要求如何编写功能。因此,我将支持您的回答并接受@tozka 回答,因为它对我有用。感谢您的解释!
    • 我使用了这个解决方案。我希望文本格式保持多年。我正在检查字段 5 中的“实时”:access.redhat.com/documentation/en-us/red_hat_enterprise_linux/…
    【解决方案2】:

    您可以使用popenlsmod | grep 技巧:

      FILE *fd = popen("lsmod | grep module_name", "r");
    
      char buf[16];
      if (fread (buf, 1, sizeof (buf), fd) > 0) // if there is some result the module must be loaded
        printf ("module is loaded\n");
      else
        printf ("module is not loaded\n");
    

    【讨论】:

    • 看起来很脏,但它可以工作,我从来没有想过这么简单的解决方案。干杯
    • 鉴于 lsmod 打开“/proc/modules”,并且 grep 涉及另一个进程并且为管道打开附加文件,使用“grep module_name /proc/modules”并检查是否更有效是否有任何输出?即使 lsmod 不可用,这也可以工作。
    • 更好的 grep 是 '^module_name ',名称后加一个空格。
    猜你喜欢
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2015-09-21
    相关资源
    最近更新 更多