スポンサーリンク

tailコマンドの-fオプションは、ログなどを監視するときに便利なオプションです。ファイルが更新されると更新された分を表示することができます。

ファイルが更新されたときに知る方法として、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]

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


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

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

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入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー