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

11

我正在编写一个C语言守护进程,需要两个内核模块的存在才能发挥作用。程序不直接使用这些(或任何其他)模块。它只需要这些模块存在即可。 因此,我希望以编程方式检查这些模块是否已经加载,以便在运行时向用户发出警告。

在开始执行解析/proc/moduleslsmod输出之类的操作之前,是否已经存在某个实用函数呢? 例如is_module_loaded(const char* name);

我相信这个问题以前已经被问过了。 但是,我认为我错过了正确的搜索术语。

2个回答

18

并没有这样的函数。事实上,lsmod (lsmod.c) 的源代码中有以下行,应该会帮助你找到解决方案:

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

现在也有一种过时的query_module方法,但似乎只存在于内核头文件中。


我的问题表述不够明确,既询问了这种功能的存在,又询问了如何编写该功能的代码。因此,我将点赞您的回答并接受@tozka的回答,因为它对我有用。感谢您的解释! - user237076
我使用了这个解决方案。希望文本格式能够保持多年不变。我正在检查第5个字段中是否包含“Live”:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-modules - JCCyC

5
你可以使用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");

看起来很不专业,但它能够正常工作,而且我从未想过会有如此简单的解决方案。干杯! - user237076
1
考虑到lsmod打开了“/proc/modules”,而grep涉及到另一个进程和管道的附加文件打开,使用“grep module_name /proc/modules”并检查是否有任何输出是否更有效呢?即使没有lsmod,这也可以工作。 - Jeremy
1
一个更好的grep是“^module_name ”,名字后面加一个空格。 - JCCyC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接