2012-05-11 8 views
9

Sto usando fork nel mio codice. Prima della chiamata a fork nel mio codice, il processo padre ha dichiarato una variabile globale. Quindi, dopo la chiamata a fork, il processo figlio ottiene una copia separata della variabile globale sul proprio stack di thread o condivide l'istanza padre esistente della variabile globale. quindi immagino ci siano tre possibilità qui 1) processo figlio ottiene istanza separata della variabile globale dichiarata nel processo genitore 2) processo figlio condivide la variabile globale con il thread padre. (che probabilmente non è vero) 3) il processo figlio non ha alcuna richiesta di informazioni sulla variabile globale nel thread principale.Come ottenere variabili condivise tra processo figlio e genitore durante l'utilizzo di fork in perl

Se 2 o 3 opzioni sono vere, voglio sapere se c'è qualche modo di ottenere il variabile globale e il suo "stato/valore al momento dell'esecuzione di fork()" dichiarato nel thread padre, nel processo figlio.

in modo così ampio, esiste un modo per accedere alla variabile dei processi padre e gli stati in esso contenuti creati utilizzando fork().

risposta

11

Ogni processo ha il proprio spazio di memoria. Normalmente un processo non può accedere alla memoria di un altro processo.

Nel caso di fork, lo spazio di memoria del processo figlio inizia come una copia esatta dei genitori. Ciò include variabili, codice, ecc. Cambiare uno di questi in uno non cambierà alcuna variabile simile nell'altro.

Quindi è la risposta n. 1.


Anche se si potesse, la questione si dovrebbe chiedere non è "come faccio a condividere variabile?" ma "come faccio a scambiare dati?". Avere un canale controllato è meno soggetto agli errori in quanto fornisce un accoppiamento più sciolto e meno azione a distanza.

I tubi sono spesso utilizzati per comunicare tra genitore e figlio, ma ci sono molte altre opzioni.

0

Questo è il caso "1) processo figlio ottiene istanza separata della variabile globale dichiarata nel processo padre".

Il punto dei processi separati consiste nel separare la memoria. Quindi non è possibile condividere le variabili tra il processo padre e figlio una volta avvenuto il fork.

Si dovrebbe dare un'occhiata alla pagina di manuale perlipc che elenca alcune altre opzioni per la comunicazione tra processi (IPC). E guarda le altre domande di StackOverflow sulla comunicazione genitore-figlio.

1

Esempio di codice:

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";