原创 (十二)定時事件集成到多路IO機制

前言 在本小節中,我們將展開對定時事件的研究。首先還是和研究信號事件部分一樣,先看看它是如何集成到多路I/O中的(或者說是如何與event_base聯繫起來的)。 如何將定時事件集成到主循環中 由於seletc、poll、epol

原创 (三)libevent源文件結構

前言 在正式閱讀源碼之前,我們先對libevent的整體結構有大致的瞭解。這對我們在大體上了解libevent很有好處。 源文件結構 進入到libevent庫目錄裏面一看,好像還挺多的,不過除去腳本還有.lo與.la這些用libt

原创 宏函數爲什麼使用do{...}while{0}包起來

在我們看內核源碼或者庫以及一些優秀的源碼時,都會發現他們的宏函數是包括在do{…}while(0)內。具體的原因其實想想就能明白。 考慮下面一個特殊的例子。 宏函數的定義如下: #define test(x) \ a(x);

原创 (四)初探反應器(event_base)

前言 在本節中,我們將初次接觸struct event_base,並介紹下event_init函數。由於event_base屬於整個libevent中中心的部位,所以我們沒辦法一下就完全弄懂它,需要結合後面的各部分知識才能有一個很

原创 (六)初始化並設置event

前言 在這一小節裏我們將接觸到event.c源文件裏面的一些關於設置event接口函數。這對我們瞭解event以及它和event_base之間的聯繫很有幫助。 event_set 首先我們看一看初始化event的操作: void

原创 (十五)evbuffers緩衝區(上)

前言 evbuffer是libevent的緩衝區部分,它主要是負責緩衝區的構建等操作,而bufferevent主要負責管理輸入輸出緩衝區,相當於是對evbuffer做的一層抽象,緩衝區對於一個網絡庫幾乎是必需的。我們來介紹關於ev

原创 (十四)支持多種IO多路複用的技術

前言 衆所周知,libevent支持多種I/O多路複用,如select、poll、epoll、kqueue等。那麼其中是如何實現的呢? 主要就是結構體eventop,它內部成員有幾個函數指針,統一了每種I/O多路複用的接口,也就

原创 謹防fork與鎖之間的深坑

fork之後應當謹慎使用鎖: 這是因爲fork有一個特點,那就是子進程只會保留調用fork的那個線程,父進程中其他的線程在子進程中都會消失。但是fork之後,除了文件鎖以外,其他的鎖都會被繼承。這就導致了,如果在子進程中,對某個已

原创 (九)事件的激活與調度

前言 我們在上一個小節中分析了事件主循環的整個過程以及event_base_once函數。可能信息量有點大,這一小節,我們把event.c剩下的一部分重要的函數分析分析。 event_dispatch 我們再回到討論主循環這個話題

原创 unix/linux下幾種常見的IO模型

unix/linux下幾種常見的I/O模型: (以下圖片均引用自UNP一書) 阻塞式I/O: 顧名思義就是當進行I/O時,數據還沒有準備好,就會阻塞在I/O上。 下面配合代碼進行講解: #include <string.h>

原创 (十)信號事件集成到多路I/O機制

前言 之前剖析代碼的時候我們知道事件沒激活前,都有自己的數據結構來管理,但是在激活之後都是放在激活鏈表中的。本小節我們將介紹libevent中關於信號事件如何管理,如何將信號事件統一到多路I/O複用事件中一起管理的。 首先我們先

原创 (五)struct event結構體

前言 之前說到過libevent是基於事件驅動模型的網絡庫,其中的事件,就是event,它的確算是libevent中最核心的部分,而上一節說到的event_base其實算是驅動部分,負責事件的各種處理。它們之間的關係是,一個eve

原创 (一)libevent安裝及簡單的使用

前言 首先我閱讀的版本是libevent-1.4.14b-stable版本。1.4系列雖然比較古老,但是它的源碼相對簡單,便於學習,並且主要的思想與2.0系列是一致的。 附上官網鏈接:http://libevent.org/ 安

原创 (十六)evbuffers緩衝區(下)

前言 在上節中,我們介紹了evbuffers的部分知識,在本小節中,我們將對剩餘的部分一起分析總結。 evbuffer_drain 在上節中分析的evbuffer_add_buffer中,如果添加源緩衝區到目的緩衝區結尾成功,則會

原创 (十一)信號事件的管理

前言 在上一小節中我們主要講解了信號事件是如何合併到多路I/O複用機制中的以及信號事件的初始化。在本小節中,我們將看到有關信號事件的主要操作。 信號事件的註冊 前面我們看到了信號事件是在何時何地如何被初始化的,一個事件無非就是初始