Ho provato con il secondo metodo, e con un solo parametro non ci sono problemi, tutto va bene. Il problema è che devo passare tre long. Se modifico e aggiungo gli altri due parametri solo il primo arriva esatto, questo è il codice un pò modificato da me:

codice:
        //id_ut,id_mes sono le mie variabili long
        //u_cont è un int
       //sono questi i parametri che devo passare


        static char *argv[4] ;
        static char arg0[] = "a.out";
        unsigned long *address=malloc(sizeof(long));
	*address =id_ut;
		
        unsigned long *addressb=malloc(sizeof(long));
	*addressb=id_mes;

	unsigned int *addressc=malloc(sizeof(int));
	*addressc=u_cont;


	pid_t pid=fork();



	switch(pid){
		case 0:
			/* Questo e' il processo figlio */



			argv[0] = arg0;
			argv[1] = ( char * ) address;
			argv[2] = ( char * ) addressb;
			argv[3] = ( char * ) addressc;
			argv[4] = NULL;


			execv( "../Client/a.out",  argv);
			/* 
			* Se il controllo e' giunto qui allora si e' verificato
			* un errore nella chiamata execv().  
			*/
			fprintf( stderr, "%s: execv()\n", strerror(errno) );
			break;

nel client le prendo con

codice:
	unsigned long id_ut=malloc(sizeof(long));
	unsigned long id_mes =malloc(sizeof(long));
	
	unsigned int u_cont =malloc(sizeof(int));
	id_mes=* ( ( unsigned long * ) argv[2] ) ;
	id_ut=* ( ( unsigned long * ) argv[1] ) ;
	u_cont=*( ( unsigned int * ) argv[3] ) ;
solo id_ut arriva esatta.


Che sbaglio?