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$ |
