A.2. ウェイクアップ (Wake-ups)
多くのアプリケーションは、設定ファイルの変更を確認するためにスキャンします。多くの場合、スキャンは例えば毎分など、決まった間隔で実行されます。このスキャンが問題になる理由は、スキャンにより回転が停止しているディスクをウェイクアップさせるためです。最善策は、適切な間隔、適切な確認方法を見つけるか、inotify で変更を確認して、イベントに対応することです。inotify はファイルまたはディレクトリで様々な変更を確認できます。
例を示します。
int fd; fd = inotify_init(); int wd; /* checking modification of a file - writing into */ wd = inotify_add_watch(fd, "./myConfig", IN_MODIFY); if (wd < 0) { inotify_cant_be_used(); switching_back_to_previous_checking(); } ... fd_set rdfs; struct timeval tv; int retval; FD_ZERO(&rdfs); FD_SET(0, &rdfs); tv.tv_sec = 5; value = select(1, &rdfs, NULL, NULL, &tv); if (value == -1) perror(select); else { do_some_stuff(); } ...
このアプローチの優れている点は、確認できる方法が多岐に渡っている点です。
主な制限は、1 つのシステムでは利用できる監視の数が限られていることです。この数は
/proc/sys/fs/inotify/max_user_watches
から取得できます。この数値を変更することは可能ですが、推薦されません。さらに、inotify が失敗すると、コードは別の確認方法にフォールバックする必要がありますが、これは通常ソースコードの #if #define
が多く発生することを意味しています。
inotify についての詳細情報は、inotify man ページを参照してください。