在中,結構體定義如下:
struct __wait_queue_head ;
typedef struct __wait_queue_head wait_queue_head_t;
且struct list_head ;
再來看定義並初始化乙個wait_queue_head_t 的函式:
主要就是定義個乙個
wait_queue_head_t 的變數,然後初始化,lock初始化為unlock, task_list裡面的next和pre都指向自己的list_head。
#define __wait_queue_head_initializer(name) }
#define declare_wait_queue_head(name) \
wait_queue_head_t name = __wait_queue_head_initializer(name)
我們再來看這個這個結構體:
struct __wait_queue ;
把整個佇列畫出來,是這樣的,中間的節點是wait_queue_t,乙個等待佇列包含了等待特定事件的所有程序。
在我們這樣使用:
declare_wait_queue_head(queue_name);
就新建並初始化了乙個queue的頭結點。
然後呼叫以下函式,就新生成了乙個wait_queue_t 的節點,並加入到這個佇列中,這樣在等待的事情發生後,核心就可以從該佇列中找到等待的程序。
wait_even(queue_name, condition);
wait_even_interruptible(queue_name, condition);
wait_even_timeout(queue_name, condition, timeout);
wait_even_interruptible_timeout(queue_name, condition);
喚醒的方法:
void wake_up(wait_queue_head_t* queue);
void wake_up_interruptible(wait_queue_head_t* queue);
會喚醒等待的所有程序。注意我們一般都把wait_even與wake_up對應起來,wait_even_interruptible與 wake_up_interruptible對應起來。
核心等待佇列的使用
1.定義等待佇列 wait queue head t my queue 2.初始化等待佇列 init waitqueue head my queue 3.定義並同時初始化佇列 declare wait queue head my queue 4.利用等待佇列使程序睡眠 wait event queu...
Linux 裝置驅動 核心等待佇列
在 linux 驅動程式設計中,可以使用等待佇列來實現程序的阻塞.等待佇列可以看作儲存程序的容器,在阻塞程序時,將程序放入等待佇列 當喚醒程序時,從等待佇列中取出程序.linux 2.6 核心提供了如下關於等待佇列的操作 wait queue head t my queue init waitque...
linux驅動之等待佇列
linux驅動中,等待某種的事件發生的工作最好不要使用不斷迴圈來完成,而是採用另外一種方法,休眠與喚醒。等待佇列工作過程就是睡眠和喚醒的過程 睡眠和喚醒的過程的基本原理,當驅動程式等待事件發生時候進入休眠狀態,當該事件發生後,就會喚醒休眠狀態的驅動 使用 static declare wait qu...