我有一個驅動程序想要向用戶發送有關狀態更改的通知。在當前的實現中,它使用proc文件系統來執行此操作。讀取過程圍繞read()
循環到proc文件系統。 read()
塊與wait_event_interruptible()
,直到內核得到一箇中斷,導致write_new_data()
函數call wake_up_interruptible()
。這裏是基本的代碼(去掉所有不需要的雜波):wait_event和wake_up之間的競爭條件
static int flag=0;
DECLARE_WAIT_QUEUE_HEAD(info_wq);
//user process call read() on /proc/myfile to get to this function
int my_proc_read (struct file *filp, char *buf, size_t count, loff_t *pos)
{
wait_event_interruptible(info_wq, flag != 0);
flag = 0;
//copy buffers to user
return 0;
}
//when an interrupt comes it schedules this function on the systems' work queue
void write_new_data()
{
//fill buffer with data
flag = 1;
wake_up_interruptible(&info_wq);
}
現在考慮下面的流程:
- 用戶進程調用
read()
,然後等待。 - 發生中斷 - >
write_new_data()
被調用。寫數據並致電wake_up_interruptible()
。 read()
被喚醒,讀取數據但進程沒有重新運行讀取(沒有安排 運行,沒有得到它,因爲下一個中斷...)。發生- 中斷 - >
write_new_data()
再次被觸發,調用wake_up_interruptible()
但沒有等待線程正在等待... - 過程調用read和塊。
注意:這一切都發生在單處理器系統上。另外只有一個線程讀取和一個線程寫入新數據。
如何避免丟失第二個中斷? (一種解決方案是使用netlink的插座,但我不知道是否有一種方法可以做到這一點在/ proc土地)
是什麼樣的驅動程序?以及它正在追查什麼狀態? –