我已经创建了一个模块,我想在其中运行无限循环,直到我不卸载模块。目前,如果我做了rmmod,它会让我注意到模块仍然很忙并且经过一段时间的内核恐慌。
while(1)
{
.......
}
在我卸载模块之前,是否有任何技巧可以运行无限循环。
答案 0 :(得分:8)
这个循环在哪个上下文中运行?这是一个非常重要的问题。
如果init_module
运行它,则insmod
进程永远不会结束,这非常糟糕。
如果某个系统调用运行它,那么系统调用将不会返回,它也将是坏的
在这两种情况下,都没有办法杀死这个过程(甚至不是kill -9
)
如果你在softIRQ处理程序(或者更糟的是,hardIRQ处理程序)中执行它,你将挂起系统。
如果你在一个专门负责这项任务的内核线程中这样做,你就有机会把它弄好
但是如果你不想完全占用CPU,你需要调用调度程序并让它运行其他任务。 msleep_interruptible
是一种很好的方式。
答案 1 :(得分:2)
我不确定这是否有效,但不是while(1)
,而是使用while(notStopped)
,最初设置为1
,并将其设置为0
in stop_module()
。