PDA

Visualizza la versione completa : [C] problema con variabili globali


17RoiDavid
17-05-2008, 02:37
ciao a tutti....nel mio programma sono costretto ad usare una variabile globale. So che è sconsigliato usarle ma vi posso garantire che stavolta devo usarle per forza.
Comunque..il problema è il seguente:
Ho un main in cui diciamo modifico questa variabile globale. Dopo questa modifica chiamo la fork(). Quando sto nel caso del processo figlio (quindi if(pid==0)) rimodifico la variabile globale mettendo ovviamente un valore diverso da quello impostato precendentemente dal padre.
Adesso, quando il figlio termina, il padre stampa il valore della variabile globale. Il problema è che il valore stampato è quello che aveva impostato lui all'inizio e non quello impostato dal figlio. Chiaramente questa stampa avviene DOPO che il figlio ha terminato quindi abbiamo la certezza che il figlio ha fatto la sua modifica prima della stampa.

Ho quindi pensato che questo problema sia dovuto al fatto che il figlio lavora sulla sua copia della variabile globale. La domanda è: è possibile fare modificare al figlio la variabile globale in modo che il processo padre veda le modifiche fatte dal figlio?

spero di essere stato chiaro nella spiegazione del mio problema...CIAO A TUTTI

mondobimbi
17-05-2008, 07:56
non penso che sia possibile fare un programma complesso in C senza usare variabili globali, sarebbe probabilmente diverso se tu utilizzassi il C++ .
In effetti con la fork il figlio lavora con una copia del programma e quindi la tua variabile globale diventa globale solo per il figlio.
Per non avere questo effetto dovresti usare il thread, insieme a mutex e semafori per sincronizzare l'accesso alle variabili globali. Questo però ti complica un po' il programma.
ciao
sergio

MacApp
17-05-2008, 12:27
Originariamente inviato da mondobimbi
non penso che sia possibile fare un programma complesso in C senza usare variabili globali
pensi male ;-)

17RoiDavid
17-05-2008, 12:31
scusate ma è possibile che non funziona nemmeno nel caso questa variabile sia un puntatore?
cioè, anche se il figlio lavora sulla sua copia questa copia "dovrebbe" sempre puntare alla stessa zona di memoria no?

mondobimbi
17-05-2008, 12:36
Originariamente inviato da MacApp
pensi male ;-)

la maggior parte delle librerie C usa variabili globali. D'altra parte la programmazione procedurale deve per sua natura accettare l'uso delle variabili globali, e forzare il suo non-utilizzo rende il programma meno comprensibile. L'importante è utilizzare le variabili globali con buon senso.
Altro discorso sono i linguaggi che prevedono la programmazione ad oggetti, come il C++, per il quale è possibile eliminare totalmente le variabili globali non compromettendo la comprensione del codice e scrivendo codice più robusto.
ciao
sergio

MacApp
17-05-2008, 13:01
Originariamente inviato da mondobimbi
la maggior parte delle librerie C usa variabili globali. D'altra parte la programmazione procedurale deve per sua natura accettare l'uso delle variabili globali, e forzare il suo non-utilizzo rende il programma meno comprensibile. L'importante è utilizzare le variabili globali con buon senso.

ok tu sei quel mio ex collega che piazzava variabili globali con buon senso?
Non ti dico i danni. ;-)

17RoiDavid
17-05-2008, 13:44
mi è venuta un'idea...diciamo che questa variabile globale è un puntatore a struttura.
Se io lo modifico localmente al processo figlio e poi lo scrivo in una fifo al processo padre?
secondo voi funziona così?

caccy87
17-05-2008, 14:19
Non so se è quello che ti serve cmq credo di aver capito che hai usato una variabile globale, poi nella funzione fork () usi una variabile con lo stesso nome (immagino fork sia tipo fork (tipo nome_varglobale )...se la cosa è utile continua così, sennò o levi il passaggio alla funzione e usi direttamente la variabile globale o usi l'operatore di scope in modo da accederequando vuoi alla globale....
Ti lascio un esempio così capisci che voglio dire....

int tua_globale;


tipo fork (argomenti vari,int tua_globale)
{

tua_globale=12; //questa è locale come variabile
::tua_globale=23; //in questo modo indichi al compilatore di usare la variabile con
// quel nome non locale....
}

int main()

{
.
.
.
fork (argomenti vari);
.
.
return 0;
}


Spero di non aver capito male, se non era quello ce ti serviva scusami....
:)

Ciao!

17RoiDavid
17-05-2008, 14:22
no allora la fork è una funzione di sistema che non prende argomenti. Serve per creare un processo del tutto uguale al processo chiamante. Il processo creato continuerà la sua esecuzione dalla riga immediatamente dopo la chiamata a fork e girerà come un normale processo nel sistema. L'unica osservazione sulla fork è che il processo figlio lavora sulla sua copia delle variabili, e non su quelle del padre.
il mio problema è che la copia viene fatta anche per le variabili globali. è questo il problema.

caccy87
17-05-2008, 14:31
ah ok non sapevo della fork, scusami :D

Allora boh, le l'operatore :: non funziona non saprei che fare...Cioè, è indispensabile la globale? Coi puntatori non riesci a farlo? però mi dirai, se copia tutto perdi l'accesso anche ai puntatori giusto ??


Mi spaice di non esserti utile, scusa per la perdita di tempo :zizi:
ciao!

Loading