スポンサーリンク

このドキュメントの内容は、以下の通りです。

libeventは、スケーラブルなネットワークサーバを開発するためのイベント通知ライブラリです。
libeventは、memcachedなどで利用されています。
libeventは、イベントの抽象化ライブラリです。
libevent APIは特定のイベントがファイルディスクリプタに発生するか、タイムアウトに達した場合に、コールバック関数を実行するためのメカニズムを提供します。

ファイルの更新やソケットのデータ到着などのイベントを監視する
アプリケーションを開発するには、FreeBSDでは、selectやkqueueなどを
利用します。Linuxならepollを利用します。

このように、プラットフォームになるオペレーティングシステムによって
利用するAPIが異なるため、移植性が低くなります。それに固有のAPIを
学習しなければなりません。

libeventでは、UNIX系のシステムで非同期なI/Oに対する統一された
インターフェースを提供してくれるライブラリです。

libeventの使い方については、 [2008-11-29-1] を参照してください。

[2008-11-29-1] libeventとは イベント通知とI/Oバッファ
[2008-11-30-1] libeventとは タイマーとタイムアウト
[2008-11-28-1] libeventを使った簡易tailコマンド

libeventサンプルコード


tailコマンド風のプログラムをlibeventで書いてみました。

ファイルをオープンし、ファイルの読み込みに関するイベントをlibeventに登録します。ファイルが更新されるとコールバック関数が呼び出されます。

#include <stdio.h>
#include <stdlib.h>
#include <err.h>
#include <unistd.h>
#include <sys/types.h>

#include <fcntl.h>
#include <event.h>

#define BUF	256
void
file_read(int fd, short event, void *arg)
{
	char		buf[BUF];
	int		len;
	struct event	*ev	= arg;

	event_add(ev, NULL);
	len	= read(fd, buf, sizeof(buf) - 1);
	if (len == -1) {
		warn ("can not read");
		return;
	} else if (len == 0) {
		warnx ("close");
		return;
	}

	buf[len] = '\0';
	(void) printf ("%s", buf);
}

int
main (int argc, char *argv[])
{
	int	fd;
	int	flags	= O_RDONLY;
	char	*file	= argv[1];
	if ( (fd = open (file, flags) ) == -1) {
		err(EXIT_FAILURE, "can not open(%s,%d)", file, flags);
	}
	struct event evfile;
	event_init ();	// libeventの初期化
	event_set (&evfile, fd, EV_READ, file_read, &evfile);
	event_add (&evfile, NULL);
	event_dispatch ();

	exit (EXIT_SUCCESS);
}

コンパイル方法

cc -I/usr/local/include -L/usr/local/lib -levent mytail.c

実行方法

ターミナルを2つ用意します。

ファイルを作成してから、プログラムを実行します。
touch /tmp/foo
./a.out /tmp/foo
終わり方は、 C-c で終わらせてください。

ファイルに文字を追加してみます。
echo 123 >> /tmp/foo
echo 456 >> /tmp/foo
ファイルに文字を追加すると、a.outのプログラムは、入力された文字を画面に表示します。

参考

[2008-05-03-1] FreeBSD C言語 kqueue/keventで簡易tail -fコマンドを作る
参照しているページ (サイト内): [2008-12-02-1] [2008-11-30-1] [2008-11-29-1] [2008-11-28-1]

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー