libeventを試用したイベントのトリガ
nginx、nodejs、Luaなどの技術が大いに異彩を放つ時、私達のプログラムの設計の習慣も絶えず変える中で、今何も“異歩”を必要として、異歩ができないで他の人と開きました.多プロセスマルチスレッドのモデルなどに基づいた教材では、現在のインターネットプロジェクトのニーズを十分に満たすことができないようです.
私達は異なったオペレーティングシステムを知っています.底のカーネルはIOのイベント駆動モデルに対して違います.poll、select、windows select、epoll、kqueueなど様々な選択があります.これらのIOのマルチ選択に対して、nginxサーバーはパッケージ化されています.また、libeventライブラリもパッケージ化されていると思います.まず、libeventライブラリを使って、事件の魅力を感じてください.
まず「イベント」を作成する方法です.
libeventの公式ホームページを見ると、memcacheはlibeventライブラリに基づいて開発されているほか、有名なchromiumブラウザのUnixとmacバージョンもlibeventイベント駆動庫に基づいていることが分かりました.後でいくつかの下の階のサービスを書いてそれを使うことを考慮することができて、結局自分で1つの非ふさがりのIOの枠組みを維持しますか?それとも非常に面倒です.
私はオンラインでlibeventのhttpライブラリに基づいて実現される簡単なウェブサーバのコードを収集しました.vc 2010で運行成功を配置し、住所をダウンロードします.http://dl.dbank.com/c079f7ytkk
私達は異なったオペレーティングシステムを知っています.底のカーネルは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