FAN_OPEN_PERM | システム全体を監視したい | マルチ スレッド プログラムによる FAN_CLOSE_WRITE イベント、および一部のディレクトリ (/home/mydir など) を無視します。main() で fanotify_init() と fanotify_mark() を次のように使用しました。
//FAN_GLOBAL_LISTENER を使用する方法はありますか?
fd = fanotify_init(FAN_CLOEXEC | FAN_NONBLOCK | FAN_CLASS_CONTENT | FAN_UNLIMITED_QUEUE | FAN_UNLIMITED_MARKS, O_RDONLY | O_LARGEFILE) ...
// "/" (マルチスレッド プログラムとしては機能しません) または "/home" (正常に機能します) をマークします。
fanotify_mark(fd, FAN_MARK_ADD | FAN_MARK_MOUNT, FAN_OPEN_PERM | FAN_CLOSE_WRITE | FAN_EVENT_ON_CHILD, AT_FDCWD, "/") ....
//ここで、ディレクトリを無視します
fanotify_mark(fd, FAN_MARK_ADD | FAN_MARK_ONLYDIR | FAN_MARK_IGNORED_MASK | FAN_MARK_IGNORED_SURV_MODIFY, FAN_OPEN_PERM | FAN_CLOSE_WRITE | FAN_EVENT_ON_CHILD, AT_FDCWD, "/home/mydir")
私のプログラムでは、main() はイベントを読み取り、それを複数のスレッドに渡してさらに処理します。
問題 : 1) このマルチスレッド プログラムでは、"/" を監視するとシステムがハングしますが、"/home" では問題なく動作します。2) それでも「/home/mydir」の通知を受け取ります (「/home」とマークされ、「/home/mydir」は無視されます)。
マルチスレッドプログラムで問題なくシステム全体をマークする方法は?
無視マスクを使用してディレクトリ全体を(再帰的に)無視する方法は? (カーネル 2.6.38-8-generic)