歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux等待隊列操作

定義等待隊列頭:

wait_queue_head_t queue_head;

初始化等待對列頭:

init_waitqueue_head(queue_head);

還一種就是利用宏定義直接完成上面兩步驟:

DECLARE_WAIT_QUEUE_HEAD(queue_head);//定義和初始化都完成,其好處是方便,但是不便於你封裝一個queue_head的等待隊列頭到你自己定義的結構體中。

接下來就是定義等待隊列頭中的隊列項:

DECLARE_WAITQUEUE(name,tsk);name為要定義的隊列項變量的名字,第二個參數一般就是current來表示這個這個隊列項同當前運行這段程序的進程關聯。

再就是將隊列項name用add_wait_queue(&queue_head, &name)加入到等待隊列頭中,根據需要通過set_current_state(state)來設置進程的狀態state可以是 TASK_RUNNING,TASK_INTERRUPTIBLE 和TASK_UNINTERRUPTIBLE等。

再接著就是根據條件調用schedule()來掛起進程。在調用了schedule()代碼後面就要判斷進程是怎麼被喚醒的,到底是信號喚醒還是由於條件滿足而被正常喚醒的(既然代碼能夠運行到schedule之後表明進程已經被喚醒了,喚醒有可能是在別的地方由於操作條件滿足而被喚醒,也有可能是設置了TASK_INTERRUPTIBLE而被信號喚醒)。如果是正常喚醒就進行滿足條件操作的代碼,否則由於信號喚醒而返回錯誤。最後返回前還要remove_wait_queue()來移除隊列項。

在要喚醒等待隊列的地方要調用wake_up來喚醒隊列頭上的隊列項。

另外一種是用等待隊列的方法就是,定義和初始化等待對列頭後直接是用wait_event和wake_up來操作,但是wait_even(wq,condition)只是簡單判斷condition是真或假來等待,太過簡單了一點。

Copyright © Linux教程網 All Rights Reserved