在linux内核模块中运行无限循环

时间:2012-04-19 07:15:54

标签: c linux linux-kernel

我已经创建了一个模块,我想在其中运行无限循环,直到我不卸载模块。目前,如果我做了rmmod,它会让我注意到模块仍然很忙并且经过一段时间的内核恐慌。

while(1)
{
    .......

}

在我卸载模块之前,是否有任何技巧可以运行无限循环。

2 个答案:

答案 0 :(得分:8)

这个循环在哪个上下文中运行?这是一个非常重要的问题。

如果init_module运行它,则insmod进程永远不会结束,这非常糟糕。
如果某个系统调用运行它,那么系统调用将不会返回,它也将是坏的 在这两种情况下,都没有办法杀死这个过程(甚至不是kill -9) 如果你在softIRQ处理程序(或者更糟的是,hardIRQ处理程序)中执行它,你将挂起系统。

如果你在一个专门负责这项任务的内核线程中这样做,你就有机会把它弄好 但是如果你不想完全占用CPU,你需要调用调度程序并让它运行其他任务。 msleep_interruptible是一种很好的方式。

答案 1 :(得分:2)

我不确定这是否有效,但不是while(1),而是使用while(notStopped),最初设置为1,并将其设置为0 in stop_module()