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.
Las siglas PID, del inglés Process IDentifier, se usan para referirse al identificador de proceso.
El hijo puede obtener el identificador del proceso padre llamando a la función getppid .
La variable especial $$ contiene el PID del proceso actual. Es de sólo lectura.
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 }
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 -> 4Obsérvese como las replicas de
$ra
contienen idénticas direcciones
pero apuntan a segmentos disjuntos.
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 .
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).