是否可以从内核模块唤醒用户进程

时间:2013-04-10 22:57:09

标签: linux-kernel kernel-module kernel

我有一个用户级进程,当前正在使用sleep()函数休眠。我正在尝试编写一个内核模块,它可以首先从其PID中提取用户进程的task_struct,然后可以唤醒进程。到目前为止,我已经实现了从PID获取task_struct的代码。但是,我不知道任何可以唤醒这个过程的功能。我尝试了wake_up_process(task_struct),虽然它返回1,即成功唤醒进程,但是用户进程的sleep()语句之后的printf()语句没有被执行。是否会更改task_struct的state帮助?或者还有另一种方法可以做同样的事情吗?请进一步指导我。

1 个答案:

答案 0 :(得分:3)

这是有可能的,但你可能会采取错误的方式。 sleep()等待延迟,即使你可以在内核中发出进程的信号(基本上就像用户模式中的kill(2)一样,带有一些无害的信号,但会把你“踢出”系统调用这样做的正确方法是在内核模块导出的设备上使用休眠进程块。这样,内核模块将具有控制权 - 进程将停留在read(2)调用中,直到你的读取实现在模块返回时,进程将被卡住。

这是更可取的,因为整个睡眠的想法是在你等待的时候。当你无限期地简单地睡觉(xxxx)时,你基本上等待一段时间。此外,使用设备方法,您还可以将文件描述符添加到select(2)/ poll(2)循环中,这样可以与其他输入/输出描述符进行非常优雅的同步。