View Full Version : [C]Modifiche non viste a variabili extern
Salve ragazzi,
ho bisogno di una rinfrescata riguarda la keyword extern del C. Allora, ho scritto un programma che ne richiama un altro mediante system. Lo chiamo file1. In file1 ho dichiarato una variabile intera globale. Ora, prima di invocare system e quindi l'altro programma(file2), setto questo intero ad un valore. Subito dopo faccio la system("Nome programma"). In file2 ho dichiarato tale intero come extern, ed ho incluso l'header di file1. Il problema è che file2 non vede la modifica fatta su tale intero in quanto per lui vale sempre 0. Sicuramente è una cavolata, ma non mi ricordo.. Grazie.
beppegrillo
28-12-2006, 23:06
Salve ragazzi,
ho bisogno di una rinfrescata riguarda la keyword extern del C. Allora, ho scritto un programma che ne richiama un altro mediante system. Lo chiamo file1. In file1 ho dichiarato una variabile intera globale. Ora, prima di invocare system e quindi l'altro programma(file2), setto questo intero ad un valore. Subito dopo faccio la system("Nome programma"). In file2 ho dichiarato tale intero come extern, ed ho incluso l'header di file1. Il problema è che file2 non vede la modifica fatta su tale intero in quanto per lui vale sempre 0. Sicuramente è una cavolata, ma non mi ricordo.. Grazie.
credo che sia concettualmente sbagliato ciò che stai dicendo.
Se chiami una system("blah"), stai cancellando lo spazio di esecuzione dell'eseguibile e rimpiazzandolo con uno nuovi, quindi mi pare del tutto ovvio che perdi i riferimenti alle variabili ecc.
Prova ad utilizzare fork/thread.
credo che sia concettualmente sbagliato ciò che stai dicendo.
Se chiami una system("blah"), stai cancellando lo spazio di esecuzione dell'eseguibile e rimpiazzandolo con uno nuovi, quindi mi pare del tutto ovvio che perdi i riferimenti alle variabili ecc.
Prova ad utilizzare fork/thread.
Quindi il processo chiamato con system dovrebbe essere il processo figlio?
beppegrillo
28-12-2006, 23:31
Quindi il processo chiamato con system dovrebbe essere il processo figlio?
Direi di si. Ma la variabile per poter essere vista anche dal figlio deve essere di tipo globlale. (oppure usi qualche meccanismo di comunicazione).
Se chiami una system("blah"), stai cancellando lo spazio di esecuzione dell'eseguibile e rimpiazzandolo con uno nuovi, quindi mi pare del tutto ovvio che perdi i riferimenti alle variabili ecc.
No, quella è la exec... La system credo che faccia una fork ed una exec alla shell di sistema e poi esegua il comando...
Il fatto è che non funziona perchè i due sono processi diversi e come tali non condividono lo spazio di memoria nella quale la variabile extern è allocata.
Per fare quello che chiedi con la system (o con fork-exec) devi usare qualche tipo di comunicazione interprocesso, come ad esempio una named pipe o FIFO.
Se invece lo vuoi realizzare con fork, i tuoi programmi devono risedere nello stesso sorgente (e quindi eseguibile) e dopo la fork puoi usare i file descriptor forniti da una pipe aperta prima della fork.
No, quella è la exec... La system credo che faccia una fork ed una exec alla shell di sistema e poi esegua il comando...
Il fatto è che non funziona perchè i due sono processi diversi e come tali non condividono lo spazio di memoria nella quale la variabile extern è allocata.
sono convinto anche io che sia così
Per fare quello che chiedi con la system (o con fork-exec) devi usare qualche tipo di comunicazione interprocesso, come ad esempio una named pipe o FIFO.
le fifo sono comodissime, comunque bisognerebbe sapere cosa devi farci con quella variabile. se si tratta solamente di un numero intero ad esempio fai prima a passarlo come parametro :D
le fifo sono comodissime, comunque bisognerebbe sapere cosa devi farci con quella variabile. se si tratta solamente di un numero intero ad esempio fai prima a passarlo come parametro :D
Sicuramente, ma mi sembra che voglia che sia il chiamato a ritornare un valore al chiamante...
beppegrillo
29-12-2006, 00:34
No, quella è la exec... La system credo che faccia una fork ed una exec alla shell di sistema e poi esegua il comando...
Hai ragione la system fa la fork e poi esegui execve.
Ho bisogno di passare al programma chiamato con system una matrice di interi. Poi tale array è modificato e ripassato indietro al programma chiamante. Forse faccio prima ad usare un semplice file. Scrivo nel file prime della system ed in seguito il programma chiamato legge tale file. O forse fa al caso mio la funzione FILE * popen (const char *command, const char *mode).
Solo che non ho capito come passargli tale matrice.
beppegrillo
29-12-2006, 10:46
Ho bisogno di passare al programma chiamato con system una matrice di interi. Poi tale array è modificato e ripassato indietro al programma chiamante. Forse faccio prima ad usare un semplice file. Scrivo nel file prime della system ed in seguito il programma chiamato legge tale file. O forse fa al caso mio la funzione FILE * popen (const char *command, const char *mode).
Solo che non ho capito come passargli tale matrice.
perchè non usare una memoria condivisa?
Mai usata..
Dunque, io ho scritto questo:
#include <stdio.h>
#include <errno.h>
int main(void);
static FILE* alfiglio;
#define BSIZE 30
static char buf_padre[BSIZE]="Ciao";
/* main definition */
int main() {
if ((alfiglio=popen("NomeProgramma","w"))==NULL) {
/* Error */
printf("Internal error: %d\n", errno);
exit(-1);
}
fprintf(alfiglio,"%s\n",buf_padre);
pclose(alfiglio);
}
Il programma chiamato parte correttamente. Ma come gli dico di leggere la stringa che gli passa il padre e di ritornarmi un qualche cosa?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.