FreeBSD C言語 kqueue/keventで簡易tail -fコマンドを作る
スポンサーリンク
tailコマンドの-fオプションは、ログなどを監視するときに便利なオプションです。ファイルが更新されると更新された分を表示することができます。
ファイルが更新されたときに知る方法として、select()システムコールを使う方法もありますが、今回は、kqueue/keventを利用して、簡単なtail -fを作ってみます。
select()システムコールは、ディスクリプタをポーリングすることができます。select()はパフォーマンスがよくないため、kqueue/keventが作られました。
/tmp/a のファイルが更新されるとその内容を画面に表示します。
終了するには、C-c(コントロールc)をしてください。
mytail.cのソースコード
kqueue()は、カーネルイベントキューを作成します。
EV_SETで監視したいものと通知したい条件をセットし、
kevent()でイベントキューを登録します。
コンパイル方法
ファイルが更新されたときに知る方法として、select()システムコールを使う方法もありますが、今回は、kqueue/keventを利用して、簡単なtail -fを作ってみます。
select()システムコールは、ディスクリプタをポーリングすることができます。select()はパフォーマンスがよくないため、kqueue/keventが作られました。
/tmp/a のファイルが更新されるとその内容を画面に表示します。
終了するには、C-c(コントロールc)をしてください。
mytail.cのソースコード
kqueue()は、カーネルイベントキューを作成します。
EV_SETで監視したいものと通知したい条件をセットし、
kevent()でイベントキューを登録します。
#include <stdio.h> #include <stdlib.h> #include <err.h> #include <unistd.h> #include <sys/types.h> #include <sys/event.h> #include <sys/time.h> #include <fcntl.h> int main (int argc, char *argv[]) { char *filename = "/tmp/a"; struct kevent kev; struct kevent kev2; int fd = open(filename , O_RDONLY); if(fd == -1) { err(1, filename); } int kq = kqueue(); if(kq == -1) { err(1, "kqueue"); } EV_SET(&kev, fd, EVFILT_READ, EV_ADD, 0, 0, NULL); if(kevent(kq, &kev, 1, NULL, 0, NULL) == -1) { err(1, "kevent"); } for ( ; ; ) { int r = kevent(kq, NULL, 0, &kev2, 1, NULL); if(r == -1) { err(1, "kevent"); } char buf[256]; ssize_t len = read(fd, buf, sizeof(buf)); if(len == 0) { break; } else if (len == -1) { err(1, "read"); } (void) printf ("%.*s", len, buf); } exit (EXIT_SUCCESS); }
コンパイル方法
cc mytail.c
実行方法
./a.out
参照しているページ (サイト内): [2008-11-28-1] [2007-10-01-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