Thursday, August 10, 2006

為何新版 kernel 使用 select 沒反應

這次porting在軍事網路這邊花的很多時間才搞定,原因主要出在select沒有反應!?

以往在舊的 kernel 中,使用 select 的 library 時,第一個參數需給定要 monitor的socket最大值加一,代表後面的 fd_set 要看多「長」,而以往較偷懶的寫法會將這值直接給一個較大的值,例如給個 4096 如此一般,進到 kernel 後會根據這個 task 的 file descriptor table 的最大值自己做修正

但測試新的kernel (2.6.16.1) 發現過大的值竟然會產生 bad file descriptor 的訊息,而在 nctuns code 裡面是直接給定 nfds = 4096 ,如此就一直產生 error ,所以一直沒有反應..

在 command_server.c 裡 cmd_server::checkIPCmessages() 將 select 的部分改以自己計算已經開啟過 socket 的最大值加一就回復正常了…

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo

1 Comments:

Andy Tzeng said...

這部分不知道是不是 bug, 我再測 2.6.17.8 的 kernel 就又回到之前的模式,過大也會自己修改到 file descriptor 最大值,只有使用 2.6.16.1 才出現 bad file descriptor 的情況....

kernel 真是搞不懂你呀..