FreeBSD 15.0-RELEASE の新機能
15日目
https://qiita.com/s_mitu/items/2efa89458cad6b9db440
18日目
https://qiita.com/s_mitu/items/4c6f614312d93ca29cff
と連続して FreeBSD 15.0-RELEASE をディスってるのか?という記事を書いてしまいましたが、新機能の記事も書いておかないと。
15.0-RELEASE では Linux のファイルシステム監視API inotify が使えるようになりました。FreeBSD では似たような機能として kqueue / kevent システムコールがありますが、Linux からの移植で FreeBSD の作法に合わせるのは手間でしょう。移植の面倒そうな箇所なので、そこが Linux のコードそのままで動くことになり、FreeBSD で動くソースコードが増えることにつながり、FreeBSD ユーザーに潤いをもたらすことでしょう。
inotify でできること
inotify とは、ファイルシステムのイベント、例えばファイル作成やオープン/クローズ、削除や更新などをカーネルからイベントとして通知してもらえるシステムコールです。ファイル作成をループでチェックし続けるというユーザーランドでの努力をしなくていいのはかっこいいですね。
環視はファイル単体だけでなくディレクトリに対しても行えるので、特定のディレクトリ内直下(サブディレクトリ内は別)のイベントをまとめてチェックできるのは嬉しい場面が多そうです。
詳細は man inotify にありますが、
クローズイベントも
- IN_CLOSE_WRITE
書き込みオープンしたファイルのクローズ - IN_CLOSE_NOWRITE
リードオンリーオープンしたファイルのクローズ
といった細かさでイベントが分かれており、かなり詳細に何が起こったか検知できることがわかります。
具体的な使い方はサンプルを見て動かすのが手っ取り早い
この新機能を試すのに自分でコードを書くのが一番勉強になりますが、「そんなのまどろっこしい、実際の動きがさっさと見たい!」というのも人情です。
そんなあなたにサンプルコードが /usr/share/examples/inotify に入っています。中に入っている inotify.c は inotify を使ったサンプルコードとなっています。またこのディレクトリを適当な書き込み領域にコピーして
% cd inotify
% make
してあげると inotify が作成され、動きの実際の確認もできます。
サンプルは
./inotify (ファイル名 または ディレクトリ名)
とすることで、ファイルやディレクトリの環視を開始します。
ファイル aaa に対して ./inotify aaa として、
touch aaa とすると
1 IN_ATTRIB
cat aaa とすると
1 IN_OPEN
1 IN_ACCESS
1 IN_CLOSE_NOWRITE
echo data >> aaa とすると
1 IN_OPEN
1 IN_MODIFY
1 IN_CLOSE_WRITE
といったイベントが飛ぶことがわかります。
ディレクトリ ddd に対して ./inotify ddd を実行すると、
touch ddd/bbb とすると
1 IN_CREATE bbb
1 IN_OPEN bbb
1 IN_CLOSE_WRITE bbb
mv ddd/bbb ddd/ccc とすると、
1 IN_MOVED_FROM bbb
1 IN_MOVED_TO ccc
などといったイベントが飛ぶことがわかります。
inotify でファイルの作成を監視し、デスクトップに通知する
inotify.c を見れば実際のコーディングの仕方がわかると思いますし、丸パクリしてイベント処理している switch 文のところにイベントで実行させたい処理を記述するといったカスタマイズでも用が足りることもあると思います。
今回はこの inotify サンプルをそのまま使い、ディレクトリにファイルが作成されたらデスクトップに通知するシステム的なものを作ってみます。
通知には xcowsay (ports では games/xcowsay) を使ってみます。文字列を指定すると、牛の絵と吹き出しでデスクトップにメッセージを表示します。pkg install xcowsay でインストールして
xcowsay 牛です
を実行すると、
と表示されます。
しかし 2026年は午年。xcowsay は --image=画像ファイル名 で画像が差し替えられるので、午(馬)の絵に変えてみます。
そんなときたのもしいのはいらすとやさん。ということで話題になった馬の絵
を縮小した small_eto_centaur_happy.png を作成し、xcowsay --image=small_eto_centaur_happy.png 〜 と指定して使ってみます。
実際のコマンドとしては
./inotify ddd |
sed -u -e '/IN_CREATE/s/.* IN_CREATE //p;d' |
xargs -n 1 -I % xcowsay --image=small_eto_centaur_happy.png --at=1800,50 % ファイルできた
とします。
- ddd ディレクトリ直下にファイルが作成されると IN_CREATE 〜 文字列が出力される。
- sed でファイル名を抽出する(-u をつけてバッファリングされないようにして逐次実行されるようにする)
- xargs -n 1 で文字列一つ来たら xcowsay を実行する(--at=X,Y で表示位置を右上にしている)。
これでddd ディレクトリ以下にファイルを作成すると、以下のようにデスクトップ通知されるようになります。
とりあえずファイルができただけで大げさにめでたい感じになりました。
まとめ的なしめくくり
なんか後半は無理やり祝賀感を出してみましたが、ファイルシステム環視システムコールはかなり応用範囲が広いので、こ今回導入された inotify や従来の kqueue などについて、注目する一助にこの記事がなれば幸いです。

