Práctica: El PID de un Subproceso

Intente dar respuesta a la siguiente pregunta enviada a Perl Mongers: Executing a process in the background AND getting its pid

Executing a process in the background AND getting its pid

Hi all!

I need to execute the process "P" in the background. I suppose I can execute P in the background by saying

                        system "P &"

or by using fork and exec. However, my perl script need the pid of P in order to communicate with it (P creates logfiles whose names contain P's pid, and the perl script need to read these files). How do I get P's pid? I tried to use fork, but then of course I only got the pid of the new perl process. What I need is the pid of the P process.

Thanks,

Henrik
Comente las respuestas que se encuentran en Perl Mongers.



Subsecciones
Casiano Rodríguez León
2010-03-22
WIDTH="35" ALIGN="BOTTOM" BORDER="0" SRC="ull.gif" ALT="ull">pcgull
Sig: Práctica: El PID de Sup: Fork y Señales Ant: Cerrojos sobre Ficheros
Casiano Rodríguez León
2010-04-19
26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"> previous index PP2PP2 moodlepsmodulosperlmonksperldocgoogleetsiiullpcgull
Sig: Práctica: Callbacks en ForkManager Sup: Fork y Señales Ant: El Módulo Parallel::Simple
Casiano Rodríguez León
2010-04-20
ns{abort_on_error} ) { 39 while ( my ( $pid, $child ) = each %child_registry ) { 40 unless ( defined $child->{return_value} ) { 41 kill( 9, $pid ); 42 $child->{return_value} = -1; 43 } 44 } 45 } 46 } 47 } while ( $child > 0 ); Si la opción abort_on_error está activada y un proceso termina con un código de error se eliminan todos los procesos arrancados y que no hayan finalizado. Para ello se comprueba el estatus de retorno del proceso almacenado en $?. Si es distinto de cero se procede a abortar los procesos hijo envíandoles mediante la llamada kill(9, $pid ).

La función kill permite el envío de señales a otros procesos. Su modo de uso es:

$count = kill($signal, @processes);

La llamada envía la señal $signal a los procesos cuyos PID están en la lista @processes. El resultado devuelve el número de procesos a los que la señal llegó con éxito. Las señales serán estudiadas en mas detalle en la sección 3.4.

Nótese que pudiera ocurrir que un proceso p1 terminará con éxito al mismo tiempo o poco después que otro proceso p2 lo hace con error. En tal caso la llamada a kill de la línea 41 sobre p1 fracasa en matar el zombi p1 ya que este ''ha muerto''. Sin embargo se establece la entrada $child->{return_value} a -1. En este caso el waitpid de la línea 33 cosecha posteriormente al zombi resultante de p1. Observe que bajo estas circunstancias la condición de la línea 36 'defined $child_registry{$child}{return_value}' es cierta.

Por último se calcula el valor de retorno. La variable $return_values contendrá un hash anónimo con las parejas formadas por el nombre lógico del proceso y su valor de retorno si la llamada a prun usó el formato con nombres. En otro caso $return_values contiene una referencia a un array con los valores de retorno. Para ordenar los valores de retorno (líneas 52 y 53) es necesario usar el criterio de comparación numérica ($a->{name} <=> $b->{name}).

49     # store return values using appropriate data type
50     $return_values = $named
51         ? { map { $_->{name} => $_->{return_value} } values %child_registry }
52         : [ map { $_->{return_value} } sort { $a->{name} <=> $b->{name} } 
53                 values %child_registry 
54           ];
55 
56     my $num_blocks = keys %blocks;
57     return 1 if ( $successes == $num_blocks );  # all good!
58 
59     $error = "only $successes of $num_blocks blocks completed successfully";
60     return 0;  # sorry... better luck next time
61 }
El número de claves en %blocks es el número total de procesos.

Ejercicio 3.8.1   Lea en avance la sección 3.3. Use el debugger de perl para estudiar la conducta de un programa con forks de manera que le ayude a comprender el código de prun.

Casiano Rodríguez León
2010-05-05