如何解决Linux 内核编程:interruptible_sleep_on vs wait_event_interruptible
我正在编写一个 linux 设备驱动程序(在 linux 内核版本 5.10.11-v7l+ 上)并且我正在使用 O'Reilly 的 Linux 设备驱动程序,第二版。在关于阻塞 I/O 的部分,它解释了 interruptible_sleep_on
和 wait_event_interruptible
之间的区别,以及前者如何被信号中断,后者如何通过评估条件来中断。对于我的驱动程序,我有一个 ISR 向线程发出信号,表明设备已准备好从中读取,在我看来,interruptible_sleep_on
会更可取,因为它只是向等待队列发送信号,而不是需要一个条件变量由 ISR 设置,然后由线程清除(至少在我看来,该变量需要另一种访问控制方法)。
但是,interruptible_sleep_on
不再在内核中(至少在我的版本中),而 wait_event_interruptible
是唯一的选择。我的问题是:有没有办法用 interruptible_sleep_on
复制 wait_event_interruptible
的行为,并且基本上避免使用条件变量,而只依赖被推送到等待队列的信号?
相关代码:
static int data_ready = 0;
static irqreturn_t irq_handler(int irq,void* dev_id)
{
static unsigned long flags = 0;
local_irq_restore(flags);
data_ready = 1;
wake_up_interruptible(&dataint);
return IRQ_HANDLED;
}
static int data_thread_fn(void* param)
{
allow_signal(SIGKILL);
while(!kthread_should_stop())
{
wait_event_interruptible(dataint,data_ready == 1);
data_lock(); //lock to share with main thread
data_buffer(); //read data from device
data_unlock();
wake_up_interruptible(&databuffer); //tell poll that data is ready
data_ready = 0;
if (signal_pending(data_thread))
break;
}
do_exit(0);
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。