Newsgroup: it.comp.os.linux.development
Titolo: passaggio dei parametri nella execv

Salve a tutti,
dovrei passare un intero come parametro ad un nuovo processo.
Ho provato ad assegnarlo direttamente ad una delle posizioni dell array di
puntatori a carattere ma la chiamata è fallita.
Per capirci una cosa del genere:
int mionum=<un numero qualsiasi>;
char *arg[3];
arg[0]="nomeprogramma";
arg[1]=(char*)mionum;
arg[2]=0;
execv("nomeprogramma",arg);
Evidentemente però la chiamata si aspetta un array di stringhe valido e le
copia da qualche altra parte. Qualcuno mi potrebbe dire esattamente cosa fa
questa chiamata (ai parametri, intendo)?
Ma la mia domanda principale in effetti era un'altra. Appurato che ci vuole
un array di stringhe perché il seguente codice non funziona?
<dichiarazioni>
char numarr[5];
*((int*)numarr) = mionum;
numarr[4]='\0';
/* a questo punto se faccio printf("%d\n",*((int*)numarr)) ottengo il numero
giusto*/
arg[0]="nomeprogramma";
arg[1]=numarr;
arg[2]=0;
execv("nomeprogramma",arg);
Questa volta la chiamata funziona, ma nel nuovo processo il numero che tiro
fuori così:
int num;
num = *((int*)argv[1]);
non è il numero che avevo nel processo padre.
Com'è possibile?
Come posso fare?
Vi ringrazio
Matteo

 Come posso fare?
Consiglio di ripassare un po' le tue conoscienze di C, evidentemente non
hai ben chiaro cosa sia il cast e come si facciano le conversioni tra i
vari tipi...
-- 
HappyCactus - Linux User #209744 - 
http://pngstego.sourceforge.net
 
              pngstego 0.3.2 has been released! 
/* Ci sono 10 categorie di persone al mondo: quelle che capiscono */
/* il sistema binario e quelle che non lo capiscono.              */

 vari tipi...
Ma in C non si può lavorare a basso livello? Io volevo solo assegnare i
quattro byte dell'intero ai primi 4 byte dell'array di stringhe. A
prescindere dai tipi. Il casting del puntatore mi serve solo per puntae a 4
byte invece che 1. Ma la cosa che non capisco è perché nel processo padre
l'operazione sembra aver funzionato mentre nel figlio mi ritrovo altre cose?
Grazie
Ciao
Matteo

 altre cose?
Perche' un intero ha una rappresentazione binaria, mentre una stringa
una rappresentazione ascii.
Esempio da asilo:
int a = 1;   /* a vale 0x00000001 in forma esa */
char *s = (char *)a;    /* s vale 0x00000001, mentre *s... */
char *t = (char *)&a;   /* *s vale 0x00000001 */
char q[30];
snprintf (q, 29, "%d", a); /* *s vale "1", cioe' 0x31 0x00... */
Le rappresentazioni sono direi differenti.
Spero di essere stato maieutico...


Le rappresentazioni sono direi differenti.
Ok, questo l'ho capito,  ma infatti quello che volevo fare non era (mettiamo
che il mio intero fosse 21) creare la stringa "21". Volevo solo trovare il
modo di incapsulare un intero in una stringa. Allora magari il mio array di
caratteri i cui primi 4 byte sono quelli di un intero e l'ultimo è il
terminatore di stringa rappresenta la stringa "&%4$" ma a me non importa, a
me importa solo che quei quattro byte arrivino al processo figlio così come
sono. Perché non ci arrivano? Questo è quello che non riesco a capire... Non
so se mi sono spiegato... ognuno dei 4 byte del mio numero può interpretarli
come gli pare, come qualsiasi carattere ASCII, basta che me li fa arrivare
al processo figlio esattamente come erano nel processo padre. Invece se
faccio una printf (considerando quei quattro byte un numero cioè con
printf("%d", *((int*)arr)) nel padre ottengo una cosa e nel figlio un'altra
e questa ancora non me la spiego...
Allora l'unico modo per passare un numero ad una exec è convertirlo in
stringa e riconvertirlo nel figlio?
Grazie
Matteo

 stringa e riconvertirlo nel figlio?
No, convertirlo in qualunque modo, purche' eviti i caratteri di
controllo. E' (sarebbe) altresi' buona cosa evitare i caratteri <32 
e >128, e' per questo che, ad esempio, nelle email si usa la codifica
base64...


 stringa e riconvertirlo nel figlio?
Si.  Puoi anche usare una conversione diversa da quella decimale
classica (es. esadecimale, in lettere, ...), ma mi sembra una
complicazione inutile.
-- 
E` in corso la votazione per creare it.sport.atletica
Se sei interessato vota su news:it.news.votazioni