Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: -C- Parametri exec

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    103

    -C- Parametri exec

    Salve, devo fare una piccola applicazione, in essa faccio uso di memoria condivisa.

    Essa è composta da un client ed un server.

    Il server tra le varie cose che deve fare deve allocare un'area di memoria condivisa.
    Inoltre dal server posso lanciare il client con una fork exec.

    il problema è che non riesco a passare al client tramite la exec l'id della memoria condivisa che il server ha creato. Gli argomenti della exec sono char* l'id invece è un long. Ho provato diversi tipi di conversioni ma non riesco a capire dove sbaglio. Come faccio a passare l'argomento long al processo figlio tramite la exec?

    Grazie

  2. #2
    prova a convertire l'indirzzo in una stringa e poi fai la conversione inversa sul client

    codice:
        ...
        
        /* creazione di un processo figlio */
        pid = fork();
    
        if (pid == -1) {
    	/* La chiamata fork() e' fallita */
    	fprintf( stderr, "%s: La fork ha fallito\n", strerror(errno));
    	exit ( EXIT_FAILURE );
        } else if (pid == 0) {
    	/* Questo e' il processo figlio */
            static char *argv[] = { "mio_client", "indirizzo_mia_memoria_condivisa_come_stringa", NULL };
    
            execv( "/dove_si_trova/mio_client", argv);
    	/* 
    	 * Se il controllo e' giunto qui allora si e' verificato
    	 * un errore nella chiamata execv().  
    	 */
    	fprintf( stderr, "%s: execv()\n", strerror(errno) );
        } else {
    	/* Questo e' il processo padre */
       }
       
       ...

  3. #3
    fai una prova anche così

    codice:
       if (pid == -1) {
    	/* La chiamata fork() e' fallita */
    	fprintf( stderr, "%s: La fork ha fallito\n", strerror(errno));
    	exit ( EXIT_FAILURE );
        } else if (pid == 0) {
    
    	/* Questo e' il processo figlio */
    
            static char *argv[2] ;
            static arg0[] = "mio_client";
            static unsigned long address = il_mio_indirizzo;
    
            argv[0] = arg0;
            argv[1] = ( char * ) &address;
            argv[2] = NULL;
    
    
            execv( "/dove_si_trova/mio_client",  argv);
    	/* 
    	 * Se il controllo e' giunto qui allora si e' verificato
    	 * un errore nella chiamata execv().  
    	 */
    	fprintf( stderr, "%s: execv()\n", strerror(errno) );
        } else {
    	/* Questo e' il processo padre */
       }
    sul client dereferenzi

    unsigned long mio_indirizzo = * ( ( unsigned long * ) argv[1] ) ;


  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    103
    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?

  5. #5
    penso che devi dichiararle static anche le unsigned long

    ciao
    sergio

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    103
    Se le dichiaro statiche poi non posso assegnargli come valore una variabile, o sbaglio?

    Quando compilo ricevo:

    error: initializer element is not constant

  7. #7
    io proverei così

    codice:
    #include  <stdio.h>
    #include  <sys/types.h>
    
    int main () {
            //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";
    
            static unsigned long id_ut = 9999999;
    		
            static unsigned long id_mes = 8888888;
    
    	static unsigned int u_cont = 102;
    
    
    	pid_t pid=fork();
    
    
    	switch(pid){
    		case 0:
    			/* Questo e' il processo figlio */
    
    
    
    			argv[0] = arg0;
    			argv[1] = ( char * ) &id_ut;
    			argv[2] = ( char * ) &id_mes;
    			argv[3] = ( char * ) &u_cont;
    			argv[4] = NULL;
    
    
    			execv( "../Client/a.out",  argv);
    
    			/* 
    			* Se il controllo e' giunto qui allora si e' verificato
    			* un errore nella chiamata execv().  
    			*/
    
    
    			break;
    	}
    
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    103
    Si ok cosi non ho problemi se do io i valori alle variabili.

    Però forse non mi sono spiegato, i valori io non li conosco e me li assegna la chiamata ad shmget()

    id_ut=shmget();

    la cosa che non capisco è perchè il primo arriva esatto e gli altri no.

  9. #9
    scusa, non capisco, fammi vedere il frammento di codice dove fai l'assegnazione

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    103
    codice:
          //Variabili globali
          long id_ut,id_mes;
          int u_cont;
    
           int main(int argc, char *argv[]){
    
    
    	key_mes=17;
    	key_ut=89;
    
             ......
    
             /*** Qui faccio assegnazioni ***/
    
    	//Creo memoria condivisa per utenti e messaggi
    
    	//Messaggi
    	id_mes=shmget(key_mes,1024,IPC_CREAT|0666);
    
    	//Utenti
    	id_ut=shmget(key_ut,1024,IPC_CREAT|0666);
    
    
    
    	if(id_mes ==-1){
    		printf("Errore nella creazione della memoria condivisa per i messaggi.\n");
    		exit(0);
    	}
    
    	if(id_ut ==-1){
    		printf("Errore nella creazione della memoria condivisa per gli utenti.\n");
    		exit(0);
    	}
            ......
            //Visualizzo il menu
    	sMenu();
    }
    
    //Il menu da varie opzioni tra le quali il login
    //Nel login faccio la fork exec;
             
    
     void loggaUtente(){
    
            static char *argv[5] ;
    
            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] = 0;
    
    
    			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;
    		case -1:
    			/* La chiamata fork() e' fallita */
    			fprintf( stderr, "%s: La fork ha fallito\n", strerror(errno));
    			exit ( EXIT_FAILURE );
    			break;
    	}
    
    }
    Se serve altro....grazie in anticipo per l'aiuto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.