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...