2010-05-30 7 views
0

J'ai un problème de débogage, pourquoi n_bytes dans la fonction read_from_fifo dans client.c ne correspond pas à la valeur écrite dans le fifo. Il ne devrait écrire que 25 octets mais il essaie de lire beaucoup plus (1836020505 octets (!) Pour être exact). Une idée de pourquoi cela se passe?problème avec fifos linux

server.c:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/wait.h> 
#include <signal.h> 
#include <pthread.h> 
#include <sys/stat.h> 

typedef enum { false, true } bool; 

//first read the int with the number of bytes the data will have 
//then read that number of bytes 
bool read_from_fifo(int fd, char* var) 
{ 
    int n_bytes; 
    if (read(fd, &n_bytes, sizeof(int))) 
    { 
     printf("going to read %d bytes\n", n_bytes); 
     if (read(fd, var, n_bytes)) 
      printf("read var\n"); 
     else { 
      printf("error in read var. errno: %d\n", errno); 
      exit(-1); 
     } 
    } 

    return true; 
} 

int main() 
{ 
    mkfifo("/tmp/foo", 0660); 
    int fd = open("/tmp/foo", O_RDONLY); 
    char var[100]; 
    read_from_fifo(fd, var); 
    printf("var: %s\n", var); 
    return 0; 
} 

client.c:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 
#include <unistd.h> 
#include <fcntl.h> 

typedef enum { false, true } bool; 

//first write to fd a int with the number of bytes that will be written afterwards 
bool write_to_fifo(int fd, char* data) 
{ 
    int n_bytes = (strlen(data)) * sizeof(char); 
    printf("going to write %d bytes\n", n_bytes); 
    if (write(fd, &n_bytes, sizeof(int) != -1)) 
     if (write(fd, data, n_bytes) != -1) 
      return true; 
    return false; 
} 


int main() 
{ 
    int fd = open("/tmp/foo", O_WRONLY); 
    char data[] = "some random string abcdef"; 
    write_to_fifo(fd, data); 
    return 0; 
} 

aide est grandement appréciée. Merci d'avance.

Répondre

0

J'ai moi-même trouvé la solution.

Le problème est un '') croyez-le ou non. La variable n_bytes est correcte, le problème est que je n'écris pas ça au fifo.

cette (write(fd, &n_bytes, sizeof(int) != -1))

devrait être cette (write(fd, &n_bytes, sizeof(int)) != -1)

Merci quand même pour vos réponses.

+0

En fait, il devrait être '(write (fd, & n_bytes, sizeof (int))! = -1)'. Vous avez encore un '' 'supplémentaire à la fin. – jschmier

+0

vous avez raison, j'ai malopied du code source. – nunos

0

La valeur de retour pour une erreur de read(2) est -1, et non 0. Votre instruction if pour la première lecture à 4 octets est donc erronée.

+0

C'est exact, mais ce n'est pas le vrai problème. – nunos

0

Avez-vous vérifié si les n octets imprimés par la fonction read_from_fifo() affichaient la bonne valeur? Notez juste que lors de l'écriture (fd, data, n_bytes) vous n'avez pas écrit la fin de la chaîne char '\ 0', et quand vous l'avez lu par read (fd, var, n_bytes), vous n'avez pas ajouté '\ 0 'à la fin de la chaîne vient de lire, donc le printf ("var:% s \ n", var); pourrait afficher une chaîne non \ 0 terminée aboutissant à des résultats imprévus.