1,等待佇列
1)定義等待佇列頭
wait_queue_head_t my_queue;
2)初始化
init_waitqueue_head(&my_queue);
//定義並初始化巨集
declear_wait_queue_head(name);
declear_waitqueue(name,tsk);//此定義巨集中的引數 不需要事先自己定義
3)新增、移除等待佇列
void fastcall add_wait_queue(wait_queue_head_t *q,wait_queue_t *wait);
void fastcall remove_wait_queue(wait_queue_head_t *q,wait_queue_t *wait);
4)等待事件
wait_event(queue,condition);
wait_event_interruptible(queue,condition);
wait_event_timeout(queue,condition);
wait_event_interruptible_timeout(queue,condition);
//等待第乙個引數queue作為等待佇列頭的等待佇列被喚醒,且第二個引數
condition必須滿足,否則阻塞
5)喚醒佇列
void wake_up(wait_queue_head_t *queue);
void wake_up_interruptible(wait_queue_head_t *queue);
//上述操作會喚醒以queue作為等待佇列頭的所有等待佇列中所有屬於該等
帶佇列頭的等待佇列對應的程序
注意:wake_up()應該與wait_event()或wait_event_timeout()成對使用
interruptible也是成對使用。
6)等待佇列上的睡眠
sleep_on(wait_queue_head_t *q);
interruptible_sleep_on(wait_queue_head_t *q);
//sleep_on()函式的作用就是將目前程序的狀態置為task_uninterruptible
並定義乙個等待佇列,之後把它附屬到等待佇列q,直到資源可獲得,q引導
的等待佇列被喚醒。sleep_on()與wake_up()應成對使用
等待佇列的典型應用
struct glb ;
size_t ***_read(struct file *filp,char __user *buf,size_t count,loff_t *ppos)
__set_current_state(task_interruptible);//修改程序為睡眠
up(&dev->sem);
schedule();//排程其他程序
if(signal_pending(current))
down(&dev->sem);//重新獲取訊號量
} if(count > dev->current_len)
count = dev->current_len;
if(copy_to_user(buf,dev->mem,count))else
//非阻塞及出錯處理及程式結束處理
out: up(&dev->sem);
out2: remove_wait_queue(&dev->w_wait,&wait);
set_current_state(task_running);
return ret;
}
Linux中等待佇列的實現
linux中等待佇列的實現 在軟體開發中任務經常由於某種條件沒有得到滿足而不得不進入睡眠狀態,然後等待條件得到滿足的時候再繼續執行,進入執行狀態。這種需求需要等待佇列機制的支援。linux 中提供了等待佇列的機制,該機制在核心中應用很廣泛。在linux 核心中使用等待佇列的過程很簡單,首先定義乙個 ...
linux中等待佇列的應用
linux核心裡的等待佇列機制在做驅動開發時用的非常多,多用來實現阻塞式訪問,下面簡單總結了等待佇列的四種用法,希望對讀者有所幫助。1.睡眠等待某個條件發生 條件為假時睡眠 睡眠方式 wait event,wait event interruptible 喚醒方式 wake up 喚醒時要檢測條件是...
Linux中等待佇列機制分析
linux中等待佇列機制分析 在軟體開發中任務經常由於某種條件沒有得到滿足而不得不進入睡眠狀態,然後等待條件得到滿足的時候再繼續執行,進入執行狀態。這種需求需要等待佇列機制的支援。linux 中提供了等待佇列的機制,該機制在核心中應用很廣泛。在linux 核心中使用等待佇列的過程很簡單,首先定義乙個...