Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    88

    [c] passare struct in fifo

    ciao a tutti, ho bisogno di una mano. vorrei passare una struttura fatta così:

    codice:
    typedef struct {
      char *comando;
      int id;
      char *par1;
      char *par2;
      char *par3;
      int val;
    }Comando;
    attraverso una named pipe

    è possibile farlo?
    finora non ci sono riuscito, ecco il mio codice di prova:

    MITTENTE:

    codice:
    int main(){
     int fd;
       if(mkfifo("fifo_in", 0666)==-1)
          printf("errore in\n");
       fd=open("fifo_in", O_WRONLY);
       Comando *p=malloc(sizeof(Comando));
       p->id=2;
       p->par1=malloc(sizeof(char)*10);
       strcpy(p->par1, "ciao\0");
       printf("%d\n", write(fd, &p, sizeof(p)));
       return 0;
    }
    DESTINATARIO:

    codice:
    int main (){
       int fd=open("fifo_in", O_RDONLY);
       Comando *p=malloc(sizeof(Comando));
       printf("%d\n", read(fd, &p, sizeof(p)));
       printf("%d\n", p->id);
       printf("%s\n", p->par1);
       return 0;
    }
    grazie in anticipo

  2. #2

    Re: [c] passare struct in fifo

    Originariamente inviato da feys88
    finora non ci sono riuscito
    Non ci sei riuscito, ma qual è il problema? Non ti compila? Dà qualche errore? Ricevi, ma non è quello che ti aspetti? E cosa ricevi?

    Senza sapere nulla a me pare che stai inviando la struttura, ma dato che contiene quattro puntatori, per chi la riceve questi non sono significativi.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    88
    in pratica la scrittura avviene ma, ovviamente il destinatario va in segfault perchè tenta di leggere una zona di memoria che appartiene al processo mittente. probabilmente sbaglio completamente l'approccio

  4. #4
    Originariamente inviato da feys88
    in pratica la scrittura avviene ma, ovviamente il destinatario va in segfault perchè tenta di leggere una zona di memoria che appartiene al processo mittente. probabilmente sbaglio completamente l'approccio
    Beh allora il problema è quello che ti ho già spiegato, i puntatori passati per chi li riceve non sono significativi. Quindi non passare quelli, ma il contenuto (il testo in poche parole). In questo modo però, non potendo ricostruire la struttura con una semplice copia, dovrai utilizzare anche uno o più byte per indicare la lunghezza delle stringhe (oppure fissare la lunghezza a priori, soluzione più semplice, ma meno ottimizzata).

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    88
    Quindi non c'è modo di passare una struttura nella fifo contenente informazioni e far si che il server riceva le informazioni, l'unico modo sarebbe pssare i singoli campi da quanto ho capito.

  6. #6
    Originariamente inviato da feys88
    Quindi non c'è modo di passare una struttura nella fifo contenente informazioni e far si che il server riceva le informazioni, l'unico modo sarebbe pssare i singoli campi da quanto ho capito.
    Certo che si può, quello che non ha senso è passare puntatori. Se la struttura non ne contiene non ci sono problemi, purchè entrambi gli applicativi utilizzino lo stesso sistema di allineamento delle strutture (cosa che puoi risolvere semplicemente con delle direttive).

    Poi sta a te vedere se la cosa è performante o meno, nel senso che se la struttura contiene un array di 1000 byte e ne utilizzi solo 3 sarebbe meglio passare la lunghezza e solo quei 3 byte...

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.