• Publicidad

Compartir memoria entre procesos

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Notapor Moraita » 2009-02-05 05:49 @284

Ok, Salva,

pero ¿cómo sabe el proceso de fuera a la hora de hacer "kill" cuál es el PID? Se supone que el pid lo genera el sistema operativo para cada instancia del programa, ¿no?, vamos, que es algo dinámico y entonces... no lo veo...

Código: Seleccionar todo
kill -USR1 P1
kill -USR1 P2
...
kill -USR1 P8


y ¿qué PID tienen P1... P8?

Perdón si esto es obvio...
Moraita
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2008-10-29 10:25 @475

Publicidad

Notapor salva » 2009-02-05 06:06 @296

La solución más fácil a eso es que escribas el PID en un fichero cuando inicias el programa. En Perl el PID es accesible a través de $$

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $pid_fn = '/var/run/foomatic/p1.pid';

END { unlink $pid_fn }

open PID, '>', $pid_fn or die "unable to create PID file";
print PID "$$\n";
close PID;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Esto suele hacerse un poco más complicado, para asegurarse de que no existe ya un programa corriendo, o que una ejecución anterior ha terminado sin borrar el fichero con el PID, etc. Seguro que también hay algún módulo en CPAN que ya lo hace todo.

Luego, para enviar la señal al proceso, por ejemplo desde la shell:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
kill -USR1 `cat /var/run/foomatic p1.pid`;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Notapor Moraita » 2009-02-05 06:13 @300

Ok, es lo que me imaginaba, ¡perfecto!
¡Gracias, Salva!
Moraita
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2008-10-29 10:25 @475

Notapor Moraita » 2009-02-05 06:39 @319

Otra pregunta, Salva.

El SIG recibe señales aun estando ejecutándose el while, ¿verdad?

Recoge la señal, ejecuta sub y el proceso vuelve al punto de ejecución donde se interrumpió, ¿no?

Quiero decir, no necesito hacer un thread para que las dos partes del programa estén en continua ejecución, ¿no?

thread 1
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$SIG{USR1} = sub { $signaled = 1 };
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


thread 2
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while(1) {
  if ($signaled) {
    $signaled = 0;
    while (my $task = get_task_from_db()) {
      $signaled = 0;
      $task->process;
    }
  }
  else {
    select(undef, undef, undef, 1);
    # la señal termina el "select", pero
    # como hay una race-condition en el periodo desde
    # que se comprueba $signaled hasta que empieza el
    # select en el que podría llegar una señal, hay que
    # usar un timeout
  }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Moraita
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2008-10-29 10:25 @475

Notapor salva » 2009-02-05 07:09 @340

Sí, cuando se recibe una señal se interrumpe el flujo normal del programa, se ejecuta el código asociado a la señal a través de %SIG y al acabar se reanuda el programa.

El único punto peliagudo que has de tener en cuenta es que desde que en el programa principal compruebas el estado del flag, que indica que se ha recibido una señal, hasta que ejecutas la acción correspondiente puede llegar otra señal que no puedes ignorar y tu programa tiene que tener mecanismos para superar que eso ocurra.

En la practica, lo que eso implica es que tienes que inspeccionar tu programa (bueno, todo no, ¡solo el bucle principal!) preguntándote "¿y qué pasa si la señal llega aquí?" en cada punto del mismo.
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Anterior

Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 33 invitados

cron