1

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

4

1 回答 1

3

这是可能的,但您可能会以错误的方式进行操作。sleep() 等待延迟,即使您可以从内核内部向进程发出信号(本质上就像用户模式下的 kill(2) 一样,带有一些无害的信号,但是会“将您踢出”系统调用) ,这样做的正确方法是在内核模块导出的设备上阻止睡眠进程。这样,内核模块将拥有控制权 - 进程将卡在 read(2) 调用中,直到你的 read 实现在模块返回时,进程会卡住。

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

于 2013-04-11T02:14:01.153 回答