pp2@nereida:~/src/perl/Event/select$ cat -n inotify2.pl 1 #!/usr/bin/perl -w 2 use strict; 3 use Linux::Inotify2; 4 5 my $inotify = new Linux::Inotify2; 6 7 $inotify->watch ("/etc/passwd", IN_ACCESS | IN_MODIFY, sub { 8 my $e = shift; 9 printf "events for <%s> received: %s\n", $e->fullname, $e->mask; 10 print "$e->{w}{name} was accessed\n" if $e->IN_ACCESS; 11 print "$e->{w}{name} was modified\n" if $e->IN_MODIFY; 12 print "$e->{w}{name} is no longer mounted\n" if $e->IN_UNMOUNT; 13 print "events for $e->{w}{name} have been lost\n" if $e->IN_Q_OVERFLOW; 14 15 $e->w->cancel; 16 }); 17 18 $inotify->poll;
El método watch tiene la sintáxis:
$watch = $inotify->watch ($name, $mask[, $cb])Añade un nuevo vigilante al notificador. El vigilante creará eventos de las clases especificadas en
$mask
para el camino especificado en $name
.
El argumento $cb
es una referencia al manejador.
Al manejador se le pasará un objeto Linux::Inotify2::Event .
Las máscara puede formarse a partir de ciertas constantes predefinidas. He aqui algunas:
IN_ACCESS objeto accedido IN_MODIFY objeto modificado IN_ATTRIB ha cambiado 'metadata' del objeto
IN_OPEN objeto ha sido abierto IN_MOVED_FROM Se ha movido fichero desde este objeto (directorio) IN_MOVED_TO Se ha movido fichero a este objeto (directorio) IN_CREATE fichero creado en este objeto (directorio) IN_DELETE fichero suprimido en este objeto (directorio) IN_DELETE_SELF objeto suprimido IN_MOVE_SELF objeto movido IN_ALL_EVENTS todos los anteriores
En esta lista,
Linux::Inotify2::Watch
que vigila
Los vigilantes disponen de los siguientes métodos:
$watch->name
El nombre del "watch".
Para los directorios es el nombre de la entrada sin los prefijos del camino
$watch->mask
Máscara especificada para el "watch"
$watch->cb ([new callback])
$watch->cancel
Cancela/suprime el watch. Los eventos futuros, incluso si fueran insertados en la cola, seránm descartados.
$watch->fullname
Nombre completo del objeto.
La llamada $count = $inotify->poll
lee eventos producidos por el kernel
y los maneja. Si el fichero esta en modo 'blocking' el método
esperará por al menos un evento. Si no esta en modo 'blocking'
y no hay eventos que pueda leer retornará inmediatamente.
Retorna el número de eventos que han sido manejados.
Los objetos Linux::Inotify2::Event describen a los eventos. Son pasados como primer argumento al callback del vigilante. Entre otros, disponen de los siguientes métodos:
$event->w
El vigilante
$event->name
El camino del objeto, relativo al nombre del vigilante
$event->mask
La máscara del evento recibido.
Además de los eventos desritos para el vigilante, tanmbién están disponibles:
IN_ISDIR es un directorio IN_Q_OVERFLOW cola desbordada
$event->IN_xxx
Cierto si el evento casa con la máscara
Terminal 2 |
pp2@nereida:~/src/perl/Event/select$ cat /etc/passwd |
Terminal 1 (ejecución) |
pp2@nereida:~/src/perl/Event/select$ ./inotify2.pl events for </etc/passwd> received: 1 /etc/passwd was accessed |
pp2@nereida:~/src/perl/Event/select$ cat -n watchfile.pl 1 #!/usr/bin/perl -w 2 use strict; 3 use Event; 4 use Linux::Inotify2; 5 6 my $inotify = Linux::Inotify2->new; 7 8 Event->io (fd => $inotify->fileno, poll => 'r', cb => sub { $inotify->poll }); 9 10 $inotify->watch ("/tmp", IN_ALL_EVENTS, sub { 11 my $e = shift; 12 printf "events for <%s>:%d received: %x\n", $e->fullname, $e->cookie, $e->mask; 13 print "$e->{w}{name} was accessed\n" if $e->IN_ACCESS; 14 print "$e->{w}{name} was modified\n" if $e->IN_MODIFY; 15 print "$e->{w}{name} is no longer mounted\n" if $e->IN_UNMOUNT; 16 print "events for $e->{w}{name} have been lost\n" if $e->IN_Q_OVERFLOW; 17 }); 18 19 Event::loop;
La llamada a $inotify->fileno
retorna el fileno para el objeto Linux::Inotify2 .
Es responsabilidad del programador que el método poll haya sido llamado
cuando este fichero esté listo para lectura.
pp2@nereida:~/src/perl/Event/select$ ./watchfile.pl events for </tmp/tailtest.tmp>:0 received: 100 events for </tmp/tailtest.tmp>:0 received: 20 events for </tmp/tailtest.tmp>:0 received: 4 events for </tmp/tailtest.tmp>:0 received: 8 events for </tmp/tailtest.tmp>:0 received: 20 events for </tmp/tailtest.tmp>:0 received: 2 /tmp was modified events for </tmp/tailtest.tmp>:0 received: 8 events for </tmp/v722626>:0 received: 40000020 events for </tmp/v722626>:0 received: 40000010 events for </tmp/v722626>:0 received: 40000200 ^C |
pp2@nereida:~/src/perl/Event/select$ touch /tmp/tailtest.tmp pp2@nereida:~/src/perl/Event/select$ echo "Hola" >> /tmp/tailtest.tmp pp2@nereida:~/src/perl/Event/select$ |