La Función fork

Cuando se llama la función fork, esta genera un duplicado del proceso actual. El duplicado comparte los valores actuales de todas las variables, ficheros y otras estructuras de datos. La llamada a fork retorna al proceso padre el identificador del proceso hijo y retorna un cero al proceso hijo.

PID

Las siglas PID, del inglés Process IDentifier, se usan para referirse al identificador de proceso.

La función getppid

El hijo puede obtener el identificador del proceso padre llamando a la función getppid .

La variable $$

La variable especial $$ contiene el PID del proceso actual. Es de sólo lectura.

Ejemplo de uso de fork

Veamos un ejemplo de uso de estas funciones:

lhp@nereida:~/Lperl/src$ cat -n fork2.pl
 1  #!/usr/local/bin/perl -w
 2  use strict;
 3
 4  print "Antes del fork: PID=$$\n";
 5
 6  my $a = 4;
 7  my $ra = \$a;
 8  my $child = fork();
 9  die "Falló el fork: $!" unless defined $child;
10
11  if ($child > 0) { # proceso padre
12    print "Aqui proceso padre: PID=$$, hijo=$child \$a = $a\n";
13    $a = 5; # Modificación local al padre
14    print "Aqui proceso padre después de a = 5: ",
15          "PID=$$, hijo=$child \$a = $a, \$ra = $ra \$ra -> $$ra\n";
16  } else { #proceso hijo
17    my $ppid = getppid();
18    print "Aqui proceso hijo: PID=$$, padre=$ppid \$a = $a, \$ra = $ra \$ra -> $$ra\n";
19  }

Ejecución

Al ejecutar el programa anterior se obtiene la salida:

hp@nereida:~/Lperl/src$ fork2.pl
Antes del fork: PID=11692
Aqui proceso padre: PID=11692, hijo=11693 $a = 4
Aqui proceso padre después de a = 5: PID=11692, hijo=11693 $a = 5, $ra = SCALAR(0x815033c) $ra -> 5
Aqui proceso hijo: PID=11693, padre=11692 $a = 4, $ra = SCALAR(0x815033c) $ra -> 4
Obsérvese como las replicas de $ra contienen idénticas direcciones pero apuntan a segmentos disjuntos.

Grupos de procesos

Los procesos hijo pueden a su vez generar nuevos hijos, creandose así una jerarquía de procesos. dicha jerarquía recibe el nombre de grupo de procesos. Todos los miembros de un grupo comparten los ficheros que estaban abiertos cuando su padre los creó. En particular comparten STDIN , STDOUT y STDERR .

La Muerte de los Huérfanos

Cuando el proceso padre muere antes que el proceso hijo los sistemas unix suelen producir una adopción automática: el proceso es ''reparented'' al proceso init (PID 1).



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