Cuando un proceso hijo se muere manda una señal SIGCHLD al proceso padre. Entonces nuestro servidor necesita registrar una llave de señal para llamar a la función "waitpid" cada vez que se manda la señal SIGCHLD:
#rutina para prevenir los zombies
sub REAPER{
#WNOHANG significa regresar inmediatamente si no hay hijo.
while ((waitpid(-1, WNOHANG)) >0 ){}
#resetea la señal para que el otro proceso hijo muera
$SIG{CHLD} = &REAPER;
}
Entonces ya para nuestro player de MP3 no hay mucho que añadir.
Básicamente el servidor empieza, entonces un cliente llega (por ejemplo xmms o mpgl23) abriendo un socket. Entonces el servidor hace un "fork" y regresa un socket al proceso hijo. Finalmente en proceso padre regresa para seguir escuchando y esperando a otro cliente. El proceso hijo simplemente irá en un loop continúo tocando canciones de nuestro lista de canciones aleatoriamente hasta que el cliente deje de escuchar.
Código del servidor
Aquí esta el código final de nuestro servidor:
#!/usr/bin/perl -wuse strict;
use IO::Socket;
#tomar el puerto a controlar o por default 8000
my $port = $ARGV[0] || 8000;
#ignorar procesos hijos para evitar zombies
$SIG{CHLD} = 'IGNORE';
#crear el socket a escuchar
my $listen_socket = IO::Socket::INET->new(LocalPort => $port,
Listen => 10,
Proto => 'tcp',
Reuse => 1);
#asegurarnos que estamos controlando el puerto
die "Cant't create a listening socket: $@" unless $listen_socket;
warn "Server ready. Waiting for connections ... n";
#esperar conexiones
while (my $connection = $listen_socket->accept){
my $child;
# crear el fork para salir
die "Can't fork: $!" unless defined ($child = fork());
Continúa en la página siguiente
Usuarios que han visto este tema también han visto...
- Trabajar con archivos en Perl
- Conectar a una Base de Datos con Perl
- Algunos trucos para programar en PERL
- Utilizando FormMail
- Hola Mundo

Información legal | Política de Privacidad | Contacte con nosotros
Otro proyecto de Factoría de Internet. Copyright© 2003-2008 Factoría de Internet S.L.. Todos los derechos reservados.