2012-05-11 99 views
9

Estoy usando fork en mi código. Antes de invocar fork en mi código, el proceso padre tiene una variable global declarada. Por lo tanto, después de la llamada de horquilla, el proceso secundario obtiene una copia separada de la variable global en su propia pila de subprocesos o comparte la instancia principal existente de la variable global. así que supongo que hay tres posibilidades aquí 1) el proceso hijo obtiene una instancia separada de la variable global declarada en el proceso principal 2) el proceso hijo comparte la variable global con el hilo padre. (que posiblemente no sea cierto) 3) el proceso hijo no tiene ninguna información buscada sobre la variable global en el hilo principalCómo obtener variables compartidas entre el proceso primario y el secundario mientras se usa fork en perl

Si 2 o 3 opciones son verdaderas, quiero saber si hay alguna forma de obtener el variable global y su "estado/valor en el momento de la ejecución de fork()" declarado en el hilo principal, en el proceso hijo.

tan ampliamente, ¿hay alguna forma de acceder a la variable padre procesos y allí estados en proceso hijo creado utilizando fork().

Respuesta

11

Cada proceso tiene su propio espacio de memoria. Un proceso normalmente no puede acceder a la memoria de otro proceso.

En el caso de fork, el espacio de memoria del proceso secundario comienza como una copia exacta de los padres. Eso incluye variables, código, etc. Cambiar cualquiera de estos en uno no cambiará ninguna variable similar en el otro.

Así que es la respuesta # 1.


Incluso si pudiera, la pregunta que debería formularse no es "¿cómo comparto la variable?" pero "¿cómo puedo intercambiar datos?". Tener un canal controlado es menos propenso a errores, ya que proporciona un acoplamiento más flexible y menos acción a distancia.

Las tuberías se utilizan a menudo para comunicarse entre padres e hijos, pero hay muchas otras opciones.

0

Este es el caso "1) El proceso secundario obtiene una instancia separada de la variable global declarada en el proceso principal".

El objetivo de los procesos separados es separar la memoria. Por lo tanto, no puede compartir variables entre el proceso principal y el secundario una vez que ocurrió el fork.

Debe echar un vistazo a la página del manual perlipc que enumera otras opciones para la comunicación entre procesos (IPC). Y mira las otras preguntas de StackOverflow sobre la comunicación entre padres e hijos.

1

Ejemplo de código:

my $ipckey = IPC_PRIVATE; 
my $idshm = shmget($ipckey, 200, 0666) || die "\nCreation shared memory failed $! \n"; 

shmread($idshm, $xxx, 0, 1) || warn "\n\n shmread $! \n"; 

shmwrite($idshm, $xxx , 0, 1) || warn "\n\n shmwrite $! \n"; 
Cuestiones relacionadas