C言語 libeventの使い方 tailを作ってみる
スポンサーリンク
このドキュメントの内容は、以下の通りです。
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]
スポンサーリンク
スポンサーリンク
いつもシェア、ありがとうございます!
もっと情報を探しませんか?
関連記事
最近の記事
- パナソニック ジェットウォッシャードルツ EW-DJ61-Wのホースの修理
- LinuxセキュリティモジュールIntegrity Policy Enforcement
- アマゾンのEcho Show 5を買ったのでレビューします
- アマゾンのサイバーマンデーはAlexa Echo Show 5が安い
- Android スマートフォン OnePlus 7T と OnePlus 7の違い
- Android スマートフォン OnePlus 7 をAndroid10にアップデートしてみた
- クレジットカードのバーチャルカードの比較のまとめ
- 活動量計 Xiaomi Mi Band 4を買ってみたのでレビュー
- Android スマートフォン OnePlus 7 のレビュー
- AliExpressでスマートフォンを買い物してみた
- パソコンのホコリ対策 レンジフードフィルターと養生テープ
- 80PLUS GOLDのPC電源ユニットAntec NeoEco 750 Goldのレビュー
- イギリスの付加価値税 VAT は払い戻しを受けられる
- イギリスのロンドンでスーツケースなど荷物を預けられる場所は
- イギリスのロンドンで地下鉄やバスに乗るならオイスターカードを使おう
- イギリスのヒースロー空港からロンドン市内への行き方
- 航空便でほかの航空会社に乗り継ぎがある場合のオンラインチェックイン
- SFC会員がANA便ではなくベトナム航空のコードシェアを試して解ったこと
- ベトナムの入国審査でeチケットの掲示が必要だった話
- シアトルの交通ICカードはオルカカード(Orca)です
人気のページ
- Windows7 IME 辞書ツールで単語の登録に失敗しました
- C言語 popen()でコマンドを実行して出力を読み込む
- Windows7で休止状態にする方法
- CentOS MySQLの起動、停止、再起動
- loggerコマンドでsyslogにエラーを出力する方法
- パソコンパーツの買取をしてくれる店のまとめ
- Java Mapの使い方 get(),put(),remove(),size(),clear()
- 楽天のRポイントカードを作ってみた
- iPhone 5 から iPhone 6 に乗り換えたのでレビュー
- netstatコマンドのステータスの意味
スポンサーリンク
過去ログ
2020 : 01 02 03 04 05 06 07 08 09 10 11 122019 : 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