徹底學會使用epoll(四) ET的寫操作例項分析

2022-09-04 07:30:13 字數 1338 閱讀 8115

**:風吹過夏天的chinaunix部落格

首先,看程式四的例子。

l 程式四

#include 

#include 

#include 

using namespace std;

int main(void)}};

這個程式的功能是只要標準輸出寫就緒,就輸出「hello world!」。

執行結果:

我們發現這將是乙個死迴圈。下面具體分析一下這個程式的執行過程:

(1) 首先初始buffer為空,buffer中有空間可寫,這時無論是et還是lt都會將對應的epitem加入rdlist(對應第一節圖中的紅線),導致epoll_wait就返回寫就緒。

(2) 程式想標準輸出輸出」hello world!」和換行符,因為標準輸出為控制台的時候緩衝是「行緩衝」,所以換行符導致buffer中的內容清空,這就對應第二節中et模式下寫就緒的第二種情況——當有舊資料被傳送走時,即buffer中待寫的內容變少得時候會觸發fd狀態的改變。所以下次epoll_wait會返回寫就緒。之後重複這個過程一直迴圈下去。

我們再看程式五。

l 程式五

相對程式四這裡僅僅去掉了輸出的換行操作。即:

cout<

執行結果如下:

我們看到程式成掛起狀態。因為第一次epoll_wait返回寫就緒後,程式向標準輸出的buffer中寫入「hello world!」,但是因為沒有輸出換行,所以buffer中的內容一直存在,下次epoll_wait的時候,雖然有寫空間但是et模式下不再返回寫就緒。回憶第一節關於et的實現,這種情況原因就是第一次buffer為空,導致epitem加入rdlist,返回一次就緒後移除此epitem,之後雖然buffer仍然可寫,但是由於對應epitem已經不再rdlist中,就不會對其就緒fd的events的在檢測了。

l 程式六

int main(void)}};

程式六相對程式五僅僅是修改et模式為預設的lt模式,我們發現程式再次死迴圈。這時候原因已經很清楚了,因為當向buffer寫入」hello world!」後,雖然buffer沒有輸出清空,但是lt模式下只有buffer有寫空間就返回寫就緒,所以會一直輸出」hello world!」,當buffer滿的時候,buffer會自動刷清輸出,同樣會造成epoll_wait返回寫就緒。

l 程式七

int main(void)}};

程式七相對於程式五在每次向標準輸出的buffer輸出」hello world!」後,重新mod out事件。所以相當於每次重新進行第一節中紅線描述的途徑返回就緒,導致程式迴圈輸出。

徹底學會使用epoll(三) ET的讀操作例項分析

風吹過夏天的chinaunix部落格 首先看程式一,這個程式想要實現的功能是當使用者從控制台有任何輸入操作時,輸出 hello world!l 程式一 include include include using namespace std int main void 執行結果 程式一中對標準輸入的監...

乙個sample學會使用epoll

include include include include include include include include include include include include define max event number 1024 define tcp buffer size 51...

徹底學會使用JS中 和 以及 和

console.log 1 2 console.log 1 2 上面列印的結果是什麼呢?運算方法 只要 前面為false,不管 後面是true還是false,都返回 後面的值。只要 前面為true,不管 後面是true還是false,都返回 前面的值。總結 真前假後運算方法 只要 前面是false,...