我有一个如下的程序。
test_module.c :
#include <linux/version.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>
int init_module(void)
{
while(1) {
pr_info("hello 4 sec\n");
msleep(4 * 1000);
}
return 0;
}
void cleanup_module(void)
{
pr_info("module removed successful\n");
}
当我加载此模块时,我的终端会冻结/阻止。如何阻止这个程序。我试过了sudo rmmod test_module
,但没有用。所以我重启了我的系统。如何打破init_module?将来,如果出现问题,如果我的init_module
没有结束,该怎么办?如果我们不停止init_module
会怎样?
答案 0 :(得分:5)
重启机器。
这是唯一的方法。用户域进程是孤立的,可以强制终止所有这些,但在内核中没有这样的保护。
init_module
函数不应该在延长的时间内执行任何操作。它应该只将模块注册到适当的数据结构。
如果您需要在内核中定期执行某些操作,则需要安排tasklet or worqueue或创建kernel thread。另见When to use kernel threads vs workqueues in the linux kernel。但是大多数内核代码应该只是在某个地方注册并在适当的事件(从硬件或通过系统调用从用户域)发生时运行。