Select函式原始碼剖析

2021-09-13 19:59:51 字數 2018 閱讀 2146

select是最基礎的io復用函式,對於其實現,做了一定的了解,記錄如下:

原始碼一進來就可以發現,它的事件是通過巨集來實現的

#define fds_in(fds, n) (fds->in + n) //讀事件

#define fds_out(fds, n) (fds->out + n) //寫事件

#define fds_ex(fds, n) (fds->ex + n) //異常事件

#define bits(fds, n) (fds_in(fds, n)|fds_out(fds, n)|*fds_ex(fds, n))//通過乙個位圖可以同時監聽三種事件

這是select的函式主體

int do_select(int n, fd_set_bits *fds, long *timeout);

首先找出最大的檔案描述符

spin_lock(¤t->files->file_lock);

retval = max_select_fd(n, fds);

spin_unlock(¤t->files->file_lock);

if (retval < 0)

return retval; //如果最大值還是小於0,報錯

n = retval; //將n設定成它最大值加1

進行初始化變數

poll_initwait(&table);

wait = &table.pt;

if (!__timeout) //如果沒有超時的話,wait置空

wait = null;

retval = 0;

核心部分

for (;;) 

for (j = 0; j < __nfdbits; ++j, ++i, bit <<= 1)

if ((mask & pollout_set) && (out & bit))

if ((mask & pollex_set) && (ex & bit))

}cond_resched();

}if (res_in)

*rinp = res_in;

if (res_out)

*routp = res_out;

if (res_ex)

*rexp = res_ex;

}//迴圈退出部分

wait = null;

//對所有的檔案描述符進行詢問後,檢查是否有事件就緒、超時或者收到訊號,就跳出迴圈

if (retval || !__timeout || signal_pending(current))

break;

//檢查是否出錯,如果出錯,就跳出迴圈

if(table.error)

__timeout = schedule_timeout(__timeout);

//繼續當前程序

__set_current_state(task_running);

//釋放位圖

poll_freewait(&table);

//更新超時時間

*timeout = __timeout;

return retval;

}

原始碼剖析就到這了,流程總結一下:

selectio復用函式,首先需要定義位圖(struct fd_set),如果有超時事件還需要超時結構(struct timeval)。

首先必須對容器進行清空!——(fd_zero(fds)),利用fd_set(fd, fds)來新增好描述符,做好準備工作

呼叫int select(int maxfdp1,fd_set readset,fd_set writeset,fd_set exceptset,const struct timeval timeout); 返回值會返回就緒描述符的數目,超時返回0,出錯返回-1。

檢測具體是否有資料流動fd_isset(fd,&fds);

原始碼剖析 Hashtable 原始碼剖析

hashtable同樣是基於雜湊表實現的,同樣每個元素都是key value對,其內部也是通過單鏈表解決衝突問題,容量不足 超過了閾值 時,同樣會自動增長。hashtable也是jdk1.0引入的類,是執行緒安全的,能用於多執行緒環境中。hashtable同樣實現了serializable介面,它支...

glibc fread函式原始碼剖析

最近看apue,看到了fread函式,就把之前想分析的乙個函式借這個機會研究一下。先寫個程式,呼叫一下fread函式。include int main 好了,還是咱們的老套路,通過gdb可以直接定位到fread的原始碼,原始碼如下,位於.libio iofread.c。io size t io fr...

python原始碼剖析 Python原始碼剖析

第頁共 頁python 原始碼剖析 物件機制 1.物件 在python 的世界中,一切都是物件,乙個整數是乙個物件,乙個字串也是 乙個物件,更為奇妙的是,型別也是乙個物件,整數型別是乙個物件,字串類 型也是乙個物件。從 年guido 在那個聖誕節揭開 python 世界的大幕開始,一直到現在,pyt...