如何将一个字符设备驱动内核模块的写入调用者置于睡眠状态

时间:2016-06-19 20:34:06

标签: c linux-kernel blocking

我在this fabulous tutorial中描述了在Linux中创建了一个字符设备驱动程序内核模块。驱动程序运行良好,但我需要扩展内核模块功能

static ssize_t device_write(struct file *filp, const char *buff, size_t len, loff_t *off)

以便在一段固定时间内阻止调用用户进程(调用函数write())。

我可以在我的内核模块中的函数linux/delay.h中包含msleep(1000)并使用device_write让CPU等待。但我不知道这是否是阻止write()在用户空间中调用函数的正确方法。

请不要将此与资源并发访问混淆。这不是我的观点。我只想阻止用户空间程序的write()调用,直到我将数据写入我的硬件设备需要一些时间。只有在此之后,我才知道操作是否成功,我可以通过device_write向用户空间程序的write调用返回适当的状态调用。

1 个答案:

答案 0 :(得分:0)

你可以在阻塞函数中使用down_interruptible(struct semaphore),并在其他一些内核线程/事件处理程序中释放信号量,从而释放调用线程。