Vigilando Manejadores de Fichero: Linux::Inotify2

Ejemplo Simple

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

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,

Métodos de los Vigilantes

Los vigilantes disponen de los siguientes métodos:

El Método poll

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

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:

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

Ejemplo con Event

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$



Subsecciones
Casiano Rodríguez León
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19