我做了一个模块,我想在其中运行一个无限循环,直到我不卸载模块。目前,如果我做 rmmod,它会让我注意到模块仍然很忙,一段时间后内核崩溃。
while(1)
{
.......
}
有什么技巧可以让我运行无限循环直到卸载模块。
此循环在哪个上下文中运行?这是一个非常重要的问题。
如果init_module
运行它,那么insmod
过程将永远不会结束,这是非常糟糕的。
如果某个系统调用运行它,那么系统调用将不会返回,并且也会很糟糕。
在这两种情况下,都没有办法杀死进程(甚至没有kill -9
)。
如果你在softIRQ处理程序(或者更糟糕的是,hardIRQ处理程序)中执行此操作,你将挂起系统。
如果您在专用于此任务的内核线程中执行此操作,则有机会正确执行。
但是,如果您不想完全占用CPU,则需要调用调度程序并让它运行其他任务。 msleep_interruptible
是一个很好的方法。
我不确定这是否有效,但与其使用 while(1)
,请使用 while(notStopped)
,它首先设置为 1
,并将其设置为 stop_module()
中的 0
。