libeventを試用したイベントのトリガ


nginx、nodejs、Luaなどの技術が大いに異彩を放つ時、私達のプログラムの設計の習慣も絶えず変える中で、今何も“異歩”を必要として、異歩ができないで他の人と開きました.多プロセスマルチスレッドのモデルなどに基づいた教材では、現在のインターネットプロジェクトのニーズを十分に満たすことができないようです.
私達は異なったオペレーティングシステムを知っています.底のカーネルはIOのイベント駆動モデルに対して違います.poll、select、windows select、epoll、kqueueなど様々な選択があります.これらのIOのマルチ選択に対して、nginxサーバーはパッケージ化されています.また、libeventライブラリもパッケージ化されていると思います.まず、libeventライブラリを使って、事件の魅力を感じてください.
まず「イベント」を作成する方法です.
#include<event2\event.h>
#include<stdio.h>

#pragma comment(lib,"ws2_32.lib")

static void discard_log(int severity, const char *msg)
{
	//       
}

int main(int argc, wchar_t* argv[])  
{
	//           
	event_set_log_callback(discard_log);

	//        ,      
	struct event_base *base;
	struct event_config *config = event_config_new();

	//         select,poll,epoll,kqueue,devpoll,evport,win32
	//
	//  ,    kqueue
	event_config_avoid_method(config, "kqueue");
	//    :EV_FEATURE_ET,EV_FEATURE_O1,EV_FEATURE_FDS
	//
	//  ,           
	event_config_require_features(config, EV_FEATURE_ET);
	//   :EVENT_BASE_FLAG_NOLOCK,EVENT_BASE_FLAG_IGNORE_ENV,
	//       EVENT_BASE_FLAG_STARTUP_IOCP,EVENT_BASE_FLAG_NO_CACHE_TIME
	//
	//  ,     
	event_config_set_flag(config, EVENT_BASE_FLAG_NOLOCK);


	base = event_base_new_with_config(config);
	event_config_free(config);

	if (base) {
		//...
	} else {
		return -1;
	}

	event_base_free(base);
	return 0;  
}
以下は「イベント」を作成するコードです.ここでは「キーボード入力」をモニターのディスクリプタとして使っています.プログラムが実行されている時に内容を入力しないと5秒のタイムアウトが発生します.Fnc関数は、5秒以内にキーボード入力があって、しかも車に戻ると、説明符は読んですぐcb_を触発することができます.func関数
#include<event.h>
#include<stdio.h>

//         
void cb_func(evutil_socket_t fd, short what, void *arg)
{
        const char *data = (const char *)arg;
	
        printf("Got an event on socket %d:%s%s%s [%s]",
            (int) fd,
            (what&EV_TIMEOUT) ? " timeout" : "",
            (what&EV_READ)    ? " read"    : "",
            (what&EV_SIGNAL)  ? " signal"  : "",
            data);
}

void main_loop(evutil_socket_t fd)
{
        struct event *ev;
        struct timeval five_seconds = {5,0};//  5 
        struct event_base *base = event_base_new();

        //    event,     fd  ,    ,        
        ev = event_new(base, fd, EV_TIMEOUT|EV_READ, cb_func,(char *)"read event");
	// event  event_base 
        event_add(ev, &five_seconds);
        event_base_dispatch(base);
}
int main(int argc, char* argv[])  
{
        //             
	main_loop(0);
	return 0;  
}
私達のプログラムはイベントを通しています.base_dispatch関数はイベントサイクルに入ります.同じように循環に入る関数はイベントイベントがあります.base_loop、後者は拡張版dispatchに相当します.具体的な循環方式を設定できます.
#define EVLOOP_ONCE             0x01
#define EVLOOP_NONBLOCK         0x02
#define EVLOOP_NO_EXIT_ON_EMPTY 0x04

int event_base_loop(struct event_base *base, int flags);
libeventはイベントも提供しています.base_loopexitとイベント_base_loopbreak関数を使用して、イベントサイクルからジャンプします.
libeventの公式ホームページを見ると、memcacheはlibeventライブラリに基づいて開発されているほか、有名なchromiumブラウザのUnixとmacバージョンもlibeventイベント駆動庫に基づいていることが分かりました.後でいくつかの下の階のサービスを書いてそれを使うことを考慮することができて、結局自分で1つの非ふさがりのIOの枠組みを維持しますか?それとも非常に面倒です.
私はオンラインでlibeventのhttpライブラリに基づいて実現される簡単なウェブサーバのコードを収集しました.vc 2010で運行成功を配置し、住所をダウンロードします.http://dl.dbank.com/c079f7ytkk