5

我制作了一个模块,我想在其中运行一个无限循环,直到我不卸载该模块。目前,如果我执行 rmmod,它会让我注意到模块仍然很忙,并且在一段时间后内核恐慌。

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

}

有什么技巧可以让我运行无限循环,直到我卸载模块。

4

2 回答 2

11

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

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

如果您在专用于此任务的内核线程中执行此操作,则您有机会正确处理。
但是,如果您不想完全占用 CPU,则需要调用调度程序并让它运行其他任务。msleep_interruptible是一个很好的方法。

于 2012-04-19T13:16:15.650 回答
3

我不确定这会起作用,但不是while(1), use while(notStopped),它1最初设置为 ,然后将其设置为0in stop_module()

于 2012-04-19T07:19:54.913 回答