package Linux::FANotify; use strict; use warnings; use Linux::FANotify::LowLevel ':constants',':functions'; use POSIX qw(); use Data::Printer; my $fan_fd = perl_fanotify_init(0,0); warn "fan fd: $fan_fd $!"; my $fan_fh;open($fan_fh,'<&=',$fan_fd); my $ret = perl_fanotify_mark( $fan_fd, CONST_mark_add,# | CONST_mark_mount, CONST_open | CONST_close | CONST_event_on_child, 0, '/tmp'); if ($ret < 0) { die "WTF? $ret"; } my $buffer;#=perl_memalign(4096,8192); sub program_for_pid { my ($pid) = @_; my $ret = ""; open my $fh,'<',"/proc/$pid/cmdline" or return $ret; my $cmdline = do { local $/;<$fh> };chomp $cmdline; return $cmdline || $ret; } sub print_event { my ($ev) = @_; my $procname = program_for_pid($ev->{pid}); my $filename = readlink "/proc/self/fd/".$ev->{fd}; $filename ||= "{fd})>"; my $mask = $ev->{mask}; print "$procname ($mask) $filename\n"; POSIX::close($ev->{fd}); } while (1) { my $len = sysread($fan_fh,$buffer,8192,0); my $ret = unpack_events($buffer); for my $ev (@$ret) { print_event($ev); } } close $fan_fh;