epoll 細節草稿

2022-03-13 16:22:39 字數 1453 閱讀 4655

1)socket tcp 中,epollin包括普通資料,connect(syn),close(fin).

2)events 中每條記錄只有12位元組,如 01 00 00 00 06 00 00 00|00 00 00 00,

資料結構如下.

typedef union epoll_data

epoll_data_t;

struct epoll_event

__epoll_packed;

epoll_data是個聯合體.所以只算最大的.意思就是這塊區域看你自己怎麼解讀了.取裡面不同的資料型別,在同乙個記憶體位址,可以解釋為不同的資料型別甚至大小.個人理解.

3)關於 struct epoll_event events[100];

服務端: 經實驗推測,資料由傳輸層到運用層時,核心根據紅黑樹,判斷是否是註冊的事件,如果是,fd加入就緒列表,資料送至fd的緩衝區buff.

當程式執行到wait,從wait返回,馬上根據就緒鍊錶中就緒fd數量,部分重寫events指標所在記憶體,

所以我們根據就緒事件數量進行處理.注意同一fd,同一事件型別,多次發生,只計算一次.

當wait後,並正處理事件時,同一fd,同一事件型別,又發生時,根據前面所述,資料會送至fd的緩衝區.所以我們可以獲得wait執行之後, 觸發事件的io資料.

而且執行完wait不會在觸發它了.個人隱隱感覺很危險啊.可能其中有原子操作吧.

但是,儘管close和資料都屬於epollin.並不會一次處理.會分2次處理.沒太深究,應該是fin時,資料是個特殊資料,read或其他函式,會讀到他為止,或者就是\eof呢,如

輸入abc回車,輸入bcd回車,並按ctrl+d,,,資料在服務斷如:  abc\nbcd\n\eof.

並有乙個地方儲存上次的返回結果,如size,

read時候,讀到最後乙個\n.如果有資料,就返回給size,如果無,檢測size是否為-1, 如果不是-1,就返回-1.給size.如果已經是-1.那麼試試看是否有\eof.

純屬猜測.

4)read 會讀入\n.

5)清空快取:

char buffcmd[3];

int cmdlen=read(stdin_fileno,buffcmd,2);

//do something.

if(cmdlen>0)//防止eof 的阻塞.避免需要再次輸入字元和回車.

6)所有特殊符號,包括空格,回車,read時,都會認為長度為1.唯獨ctrl+d認為是0.

關於Epoll,你應該知道的那些細節

epoll,位於標頭檔案sys epoll.h,是linux系統上的i o事件通知基礎設施。epoll api為linux系統專有,於核心2.5.44中首次引入,glibc於2.3.2版本加入支援。其它提供類似的功能的系統,包括freebsd kqueue,solaris dev poll等。epo...

ViewPager 思路 草稿

viewpager 是乙個容器,定義在乙個layout裡面,但是要注意定義的時候要寫明包名 guide.xml檔案 viewpager裡面的東西是另外的幾個layout guide page 1.xml檔案 用inflater的方式把這些 guide page 1.xml guide page 2....

草稿,期末專案

include include include int main else printf 回答錯誤,繼續努力 n break case 2 printf d d a,b d a b scanf d t if t d else printf 回答錯誤,繼續努力 n break case 3 print...