程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 關於函數wait

關於函數wait

編輯:關於C語言
 

wait_event_interruptible(wq, condition),該函數修改task的狀態為TASK_INTERRUPTIBLE,意味著該進程將不會繼續運行直到被喚醒,然後被添加到等待隊列wq中。

在wait_event_interruptible()中首先判斷condition是不是已經滿足,如果條件滿足則直接返回0,否則調用__wait_event_interruptible(),並用__ret來存放返回值


#define wait_event_interruptible(wq, condition)          \
({                                                       \
int __ret = 0;                                       \
if (!(condition))                                    \
__wait_event_interruptible(wq, condition, __ret);\
__ret;                                               \
})

在無限循環中,__wait_event_interruptible()將本進程置為可中斷的掛起狀態,反復檢查condition是否成立,如果成立則退出,如果不成立則繼續休眠;條件滿足後,即把本進程運行狀態置為運行態

,並將__wait從等待隊列中清除掉,從而進程能夠調度運行。如果進程當前有異步信號(POSIX的),則返回-ERESTARTSYS。


#define __wait_event_interruptible(wq, condition, ret)      \
do {                                                        \
DEFINE_WAIT(__wait);                                    \
for (;;) {                                              \
prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE);  \
if (condition)                                      \
break;                                          \
if (!signal_pending(current)) {                     \
schedule();                                     \
continue;                                       \
}                                                   \
ret = -ERESTARTSYS;                                 \
break;                                              \
}                                                       \
finish_wait(&wq, &__wait);                              \
} while (0)

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved