freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

libevent中文參考手冊(cè)-文庫(kù)吧資料

2024-11-03 11:21本頁(yè)面
  

【正文】 公用超時(shí) , 激活 , 網(wǎng)絡(luò)編程 , 未決 , 信號(hào)事件 LiveJournal: IT, libevent, 非阻塞 IO, 公用超時(shí) , 激活 , 網(wǎng)絡(luò)編程 , 未決 , 信號(hào)事件 Technorati: IT, libevent, 非阻塞 IO, 公用超時(shí) , 激活 , 網(wǎng)絡(luò)編程 , 未決 , 信號(hào)事件 libevent 參考手冊(cè)第五章:輔助類型和函數(shù) event2/定義了很多在實(shí)現(xiàn)可移植應(yīng)用時(shí)有用的函數(shù), libevent 內(nèi)部也使用這些類型和函數(shù)。 fd和 READ/WRITE標(biāo)志的事件。 版本之前 EV_PERSIST 標(biāo)志不能正確地操作超時(shí)。這些函數(shù)包括 event_add()、 event_del()、 event_active()和 event_base_once()。在 以及后續(xù)版本中,這兩個(gè)宏僅僅是event_get_fd()和 event_get_signal()的別名。 較老版本( 版之前)的 libevent 用宏 EVENT_FD()和 EVENT_SIGNAL()代表現(xiàn)在的event_get_fd()和 event_get_signal()函數(shù)。遠(yuǎn)古版本 ( 版之前 )的 libevent 使用“ timeout_”而不是“ evtimer_”。 event_set()具有一些用于更方便地處理定時(shí)器和信號(hào)的變 體: evtimer_set()大致對(duì)應(yīng) evtimer_assign(); evsignal_set()大致對(duì)應(yīng) evsignal_assign()。 接口 除了使用當(dāng)前 event_base 之外, event_set()跟 event_assign()是相似的。替代的是將事件關(guān)聯(lián)到“當(dāng)前” event_base 的 event_set()。 示例 event_initialized()函數(shù)從 版本就存在了。 除非編寫一個(gè)非常特別的應(yīng)用,通常不需要使用這個(gè)函數(shù)。 接口 警告 這個(gè)函數(shù)不能可靠地從沒有初始化的內(nèi)存塊中識(shí)別出已經(jīng)初始化的事件。 這個(gè)函數(shù)由 版本引入。不能依賴于其實(shí)際內(nèi)容: libevent 使用這個(gè)內(nèi)容來告知自身使用哪個(gè)隊(duì)列。函數(shù)返回一個(gè) 到特別的timeval結(jié)構(gòu)體的指針,可以使用這個(gè)指針指示事件應(yīng)該被添加到 O( 1)隊(duì)列,而不是 O( logN)堆。如果有大量具有單個(gè)公用超時(shí)值的事件,使用這個(gè)優(yōu)化應(yīng)該可以改進(jìn)超時(shí)處理性能。 libevent 通過放置一些超時(shí)值到隊(duì)列中,另一些到二進(jìn)制堆中來解決這個(gè)問題。 自然地, 不希望為所有超時(shí)值使用隊(duì)列,因?yàn)殛?duì)列僅對(duì)常量超時(shí)值更快。 比如說,假定有 10000 個(gè)事件,每個(gè)都需要在添加后 5 秒觸發(fā)超時(shí)事件。 7 優(yōu)化公用超時(shí) 當(dāng)前版本的 libevent 使用二進(jìn)制堆算法跟蹤未決事件的超時(shí)值,這讓添加和刪除事件超時(shí)值具有 O(logN)性能。事件不需要已經(jīng)處于未決狀態(tài),激活事件也不會(huì)讓它成為未決的。 6 手動(dòng)激活事件 極少數(shù)情況下,需要在事件的條件沒有觸發(fā)的時(shí)候讓事件成為激活的。成功時(shí)函數(shù)返回 0,失敗時(shí)返回 1。安排的事件將以默認(rèn)的優(yōu)先級(jí)加入到 event_base 并執(zhí)行。 5 配置一次觸發(fā)事件 如果不需要多次添加一個(gè)事件,或者要在添加后立即刪除事件,而事件又不需要是持久的,則可以使用 event_base_once()。 引入了event_get_base()。 event_pending()函數(shù)從 版就存在了。任何為 NULL的參數(shù)會(huì)被忽略。 event_get_callback()和 event_get_callback_arg()返回事件的回調(diào)函數(shù)及其參數(shù)指針。event_get_base()返回為事件配置的 event_base。如果提供了 tv_out 參數(shù),并且 what 參數(shù)中設(shè)置了EV_TIMEOUT 標(biāo)志,而事件當(dāng)前正因超時(shí)事件而未決或者激活,則 tv_out 會(huì)返回事件的超時(shí)值。 接口 event_pending()函數(shù)確定給定的事件是否是未決的或者激活的。 這個(gè)函數(shù)聲明在 event2/中,從 版本就存在了。只有在沒有高優(yōu)先級(jí)的事件是激活的時(shí)候,低優(yōu)先級(jí)的事件才會(huì)運(yùn)行。 多個(gè)不同優(yōu)先級(jí)的事件同時(shí)成為激活的時(shí)候,低優(yōu)先級(jí)的事件不會(huì)運(yùn)行。 接口 事件的優(yōu)先級(jí)是一個(gè)在 0 和 event_base 的優(yōu)先級(jí)減去 1 之間的數(shù)值。 在前一章討論過,每個(gè) event_base 有與之相關(guān)的一個(gè)或者多個(gè)優(yōu)先級(jí)。 3 帶優(yōu)先級(jí)的事件 多個(gè)事件同時(shí)觸發(fā)時(shí), libevent 沒有定義各個(gè)回調(diào)的執(zhí)行次序。 注意 :如果在事件激活后,其回調(diào)被執(zhí)行前刪除事件,回調(diào)將不會(huì)執(zhí)行。如果事件不是未決的或者激活的,調(diào)用將沒有效果?!?,超時(shí)事件將會(huì)等待 40 年,而不是 10 秒。 注意 :不要設(shè)置 tv 為希望超時(shí)事件執(zhí)行的時(shí)間。否則, tv 以秒和微秒指定超時(shí)值。成功時(shí)函數(shù)返回 0,失敗時(shí)返回 1。使用event_add()將事件添加到 event_base。 event 結(jié)構(gòu)體定義在event2/中。從 版 本 開 始 , 函 數(shù) 返 回 int , 在 這 之 前 函 數(shù) 返 回 void 。 下面這個(gè)例子跟上面的那個(gè)相同,但是不依賴于 中的 event 結(jié)構(gòu)體的大小,而是使用 event_get_struct_size()來獲取運(yùn)行時(shí)的正確大小。再次強(qiáng)調(diào),只有在確信堆分配是一個(gè)嚴(yán)重的性能問題時(shí)才應(yīng)該使用這個(gè)函數(shù),因?yàn)檫@個(gè)函數(shù)讓代碼難以閱讀和編寫。 libevent 提供了方便的宏將 event_assign()用于僅超時(shí)事件或者信號(hào)事件。 警告 不要對(duì)已經(jīng)在 event_base 中未決的事件調(diào)用 event_assign(),這可能會(huì)導(dǎo)致難以診斷的錯(cuò)誤。成功時(shí)函數(shù)返回 0,如果發(fā)生內(nèi)部錯(cuò)誤或者使用錯(cuò)誤的參數(shù),函數(shù)返回 1。 不在堆上分配 event 具有破壞與其他版本 libevent 二進(jìn)制兼容性的風(fēng)險(xiǎn):其他版本中的 event 結(jié)構(gòu)體大小可能不同。所以,除非確定在堆上分配事件導(dǎo)致了嚴(yán)重的性能問題,應(yīng)該堅(jiān)持使用 event_new()。 設(shè)置不使用堆分配的事件 出于性能考慮或者其他原因,有時(shí)需要將事件作為一個(gè)大結(jié)構(gòu)體的一部分。如果同時(shí)向兩個(gè) event_base 添加信號(hào) 事件,即使是不同的信號(hào),也只有一個(gè) event_base 可以取得信號(hào)。先前版本中這些宏叫做 signal_add()、signal_del()等等。 警告:不要在信號(hào)事件上設(shè)置超時(shí),這可能是不被支持的。要構(gòu)造信號(hào)處理器,使用: 接口 除了提供一個(gè)信號(hào)編號(hào)代替文件描述符之外,各個(gè)參數(shù)與 event_new()相同。 接口 除了 evtimer_new()首次出現(xiàn)在 版本中之外,這些宏從 版本就存在了。因此,如果具有EV_READ|EV_PERSIST 標(biāo)志,以及 5 秒的超時(shí)值,則事件將在以下情況下成為激活的: ?? 套接字已經(jīng)準(zhǔn)備好被讀取的時(shí)候 ?? 從最后一次成為激活的開始,已經(jīng)逝去 5 秒 只有超時(shí)的 事件 為使用方便, libevent 提供了一些以 evtimer_開頭的宏,用于替代 event_*調(diào)用來操作純超時(shí)事件。如果想在回調(diào)中讓事件成為非未決的,可以對(duì)其調(diào)用event_del()。 然而,如果設(shè)置了 EV_PERSIST 標(biāo)志,事件就是持久的。 關(guān)于事件持久性 默認(rèn)情況下,每當(dāng)未決事件成為激活的(因?yàn)?fd 已經(jīng)準(zhǔn)備好讀取或者寫入,或者因?yàn)槌瑫r(shí)),事件將在其回調(diào)被執(zhí)行前成為非未決的。 這些標(biāo)志定義在 event2/中。比如說,可以有兩個(gè)事件因?yàn)槟硞€(gè)給定的 fd 已經(jīng)就緒,可以讀取而成為激活的。這個(gè)標(biāo)志影響 EV_READ 和 EV_WRITE 的語(yǔ)義。 ?? EV_PERSIST 表示事件是“持久的”,請(qǐng)看下面的“關(guān)于事件持久性”節(jié)。 ?? EV_WRITE 表示指定的文件描述符已經(jīng)就緒,可以寫入的時(shí)候,事件將成為激活的。超時(shí)發(fā)生時(shí),回調(diào)函數(shù)的what 參數(shù)將帶有這個(gè)標(biāo)志。 事件標(biāo)志 ?? EV_TIMEOUT 這個(gè)標(biāo)志表示某超時(shí)時(shí)間流逝后事件成為激活的。 示例 上述函數(shù)定義在 event2/中,首次出現(xiàn)在 libevent 版本中。 要釋放事件,調(diào)用 event_free()。 發(fā)生內(nèi)部錯(cuò)誤,或者傳入無效參數(shù)時(shí), event_new()將返回 NULL。如果 fd 非負(fù),則它是將被觀察其讀寫事件的文件。 接口 event_new()試圖分配和構(gòu)造一個(gè)用于 base 的新的事件。刪除操作可以讓未決事件成為非未決(已初始化)的;添加操作可以讓非未決事件再次成為未決的。如果配置為“ 持久的( persistent) ”,事件將保持為未決狀態(tài)。此時(shí)可以將事件添加到 event_base中,這使之進(jìn)入“ 未決( pending) ”狀態(tài)。每個(gè)事件代表一組條件的集合,這些條件包括: ?? 文件描述符已經(jīng)就緒,可以讀取或者寫入 ?? 文件描述符變?yōu)榫途w狀態(tài),可以讀取或者寫入(僅對(duì)于邊沿觸發(fā) IO) ?? 超時(shí)事件 ?? 發(fā)生某信號(hào) ?? 用戶觸發(fā)事件 所有事件具有相似的生命周期。 注意 版本之前的 event_base 是不支持鎖的,所以這些函數(shù)并不是完全線程安全的:不允許在執(zhí)行事件循環(huán)的線程之外的其他線程中調(diào)用 _loopbreak()或者 _loopexit()函數(shù)。 本文討論的某些事件循環(huán)函數(shù)具有操作當(dāng)前 event_base的變體。 這個(gè)函數(shù)在 libevent 版本中引入。調(diào)用 event_base_dump_events()可以將這個(gè)列表輸出到指定的文件中。 這個(gè)函數(shù)是 libevent 新引入的。 注意,因?yàn)?libevent 在開始執(zhí)行回調(diào)的時(shí)候緩存時(shí)間值,所以這個(gè)值至少 是有一點(diǎn)不精確的。否則,函數(shù)調(diào)用 evutil_gettimeofday()獲取真正的當(dāng)前時(shí)間。 在回調(diào)中,可以請(qǐng)求 libevent 開始本輪回調(diào)時(shí)的當(dāng)前時(shí)間視圖。 event_break_loopexit()函數(shù)首次在 libevent 版本中實(shí)現(xiàn); event_break_loopbreak()首次在 libevent 版本中實(shí)現(xiàn)。下次啟動(dòng)事件循環(huán)的時(shí)候,這些值會(huì)被重設(shè)??梢哉{(diào)用下述函數(shù)來確定是否調(diào)用了 loopexit 或者 break 函數(shù)。 這兩個(gè)函數(shù)都在成功時(shí)返回 0,失敗時(shí)返回 1。它與 event_base_loopexit( base,NULL)的不同在于,如果 event_base 當(dāng)前正在執(zhí)行激活事件的回調(diào),它將在執(zhí)行完當(dāng)前正在處理的事件后立即退出。如果 event_base 當(dāng)前正在執(zhí)行任何激活事件的回調(diào),則回調(diào)會(huì)繼續(xù)運(yùn)行 ,直到運(yùn)行完所有激活事件的回調(diào)之才退出。 接口 event_base_loopexit()讓 event_base在給定時(shí)間之后停止循環(huán)。 這些函數(shù)定義在 event2/中,從 libevent 版就存在了。 為幫助理解,這里給出 event_base_loop()的算法概要: 偽代碼 為方便起見,也可以調(diào)用 接口 event_base_dispatch()等同于沒有設(shè)置標(biāo)志的 event_base_loop()。如果設(shè)置了 EVLOOP_NONBLOCK,循環(huán)不會(huì)等待事件被觸發(fā):循環(huán) 將僅僅檢測(cè)是否有事件已經(jīng)就緒,可以立即觸發(fā),如果有,則執(zhí)行事件的回調(diào)。 在 flags 參數(shù)中設(shè)置一個(gè)或者多個(gè)標(biāo)志就可以改變 event_base_loop()的行為。執(zhí)行循環(huán)的時(shí)候,函數(shù)重復(fù)地檢查是否有任何已經(jīng)注冊(cè)的事件被觸發(fā)(比如說,讀事件的文件描述符已經(jīng)就緒,可以讀取了;或者超時(shí)事件的超時(shí)時(shí)間即將到達(dá))。 Libevent 參考手冊(cè)第三章:與事件循環(huán)一起工作 1 運(yùn)行循環(huán) 一旦有了一個(gè)已經(jīng)注冊(cè)了某些事件的 event_base(關(guān)于如何創(chuàng)建和注冊(cè)事件請(qǐng)看下一節(jié)),就需要讓 libevent 等待事件并且通知事件的發(fā)生。沒有其他方法改變當(dāng)前 event_base。因?yàn)?event_base 不是線程安全的,這很容易導(dǎo)致錯(cuò)誤?!爱?dāng)前” event_base 是一個(gè)由所有線程共享的全局設(shè)置。 示例 event_reinit()定義在 event2/中,在 libevent 版中首次可用。所以,如果在使用 fork()或者其他相關(guān)系統(tǒng)調(diào)用啟動(dòng)新進(jìn)程之后,希望在新進(jìn)程中繼續(xù)使用 event_base,就需要進(jìn)行重新初始化。event_base_priority_init() 函數(shù)定義在 event2/中,從 libevent 版就可用了。 示例 關(guān)于示例,請(qǐng)看 event_priority_set 的文檔。調(diào)用這個(gè)函數(shù)時(shí)為n_priorities 給出更大的值是錯(cuò)誤的。每個(gè)新的事件可用的 優(yōu)先級(jí)將從 0(最高)到n_priorities1(最低)。 接口 成功時(shí)這個(gè)函數(shù)返回 0,失敗時(shí)返回 1。然而, event_base 默認(rèn)只支持單個(gè)優(yōu)先級(jí)。 event_base_free()定義在 event2/中,首次由 libevent 實(shí)現(xiàn)。 4 釋放 event_base 使用完 event_base 之后,使用 event_base_free()進(jìn)行釋放。 示例 這個(gè)函數(shù)定義在 event2/中。 接口
點(diǎn)擊復(fù)制文檔內(nèi)容
法律信息相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1