select/poll原理(阻塞挂起) 正常(阻塞轮询)
生活随笔
收集整理的這篇文章主要介紹了
select/poll原理(阻塞挂起) 正常(阻塞轮询)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
遍歷所有的fd, 如果沒(méi)好(不就緒),加入(對(duì)應(yīng)fd)等待隊(duì)列,如果所有fd都沒(méi)好(不就緒),掛起線程(schedule_timeout) 直到就緒喚醒或超時(shí),再次遍歷并退出
static int do_poll(unsigned int nfds, struct poll_list *list,?struct poll_wqueues *wait, long timeout)? ?? ?? ?? ?? ?? ???
?{? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???? ? ? int count = 0;
? ? ? poll_table* pt = &wait->pt;
??
? ? ? if (!timeout)
? ? ? ? ? pt = NULL;
??
? ? ? for (;;) {
? ? ? ? ? struct poll_list *walk;
? ? ? ? ? set_current_state(TASK_INTERRUPTIBLE);
? ? ? ? ? walk = list;
? ? ? ? ? while(walk != NULL) {
? ? ? ? ? ? ? do_pollfd( walk->len, walk->entries, &pt, &count);
? ? ? ? ? ? ? walk = walk->next;
? ? ? ? ? }
? ? ? ? ? pt = NULL;
? ? ? ? ? if (count || !timeout || signal_pending(current))
? ? ? ? ? ? ? break;
? ? ? ? ? count = wait->error;
? ? ? ? ? if (count)
? ? ? ? ? ? ? break;
? ? ? ? ? timeout = schedule_timeout(timeout); /* 讓current掛起,不占CPU,timeout到了以后再回來(lái)運(yùn)行current*/
? ? ? }
? ? ? __set_current_state(TASK_RUNNING);
? ? ? return count;
? }
總結(jié)
以上是生活随笔為你收集整理的select/poll原理(阻塞挂起) 正常(阻塞轮询)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: bdbus_lxb下载
- 下一篇: android:paddingXXX (