以编程方式在运行时检查Linux内核模块是否存在

问题描述 投票:0回答:3

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

在我开始解析

/proc/modules
lsmod
输出等操作之前,某个实用函数是否已经存在? 类似于
is_module_loaded(const char* name)
;

我很确定以前已经有人问过这个问题了。 但是,我认为我缺少搜索此内容的正确术语。

c kernel-module system-calls
3个回答
18
投票

没有这个功能。 事实上,lsmod (

lsmod.c
) 的源代码中有以下行,应该可以引导您找到解决方案:

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

还有一个已弃用的

query_module
,但现在它似乎只存在于内核头文件中。


5
投票

您可以使用

popen
lsmod | 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");

0
投票

这是一个老问题,但似乎不需要逐行阅读

/proc/modules
就可以完成。

如果模块的引用计数文件不存在,则不会加载该模块,因此可以使用

access
检查该文件。例如,可以使用以下检查来查看模块“my-module”是否已加载:

if (access("/sys/module/my-module/refcnt", F_OK))
    printf("Module my-module is not loaded\n");
© www.soinside.com 2019 - 2024. All rights reserved.