2009-05-16 10 views
0

Je suis en train de lire/d'écrire des données dans un tube nommé. Du côté de l'écriture, il est écrit qu'il écrit 110 octets constants. Du côté de la lecture pour la plupart du temps, il est dit qu'il lit 110 octets, ce qui est correct, mais d'autres fois il dit qu'il lit 220 octets ou 330 octets. Ce qui est juste dans le fait que lorsque je l'imprime, il imprime le même message deux ou trois fois de suite dans la même lecture(). Dans le code ci-dessous pour la lecture suis-je faire quelque chose de mal avec le memset pour effacer le char? Je ne peux pas penser à une autre façon de lire plus alors est écrit à moins que quelque chose reste dans le tampon.unistd.h read() lit plus de données en cours d'écriture

int fd1, numread; 
char bufpipe[5000]; 

    while(1) 
    { 
     fd1 = open("/tmp/testPipe", O_RDONLY); 
     numread = read(fd1,bufpipe, 5000);//->this should always be 110 
     if(numread > 1) 
     { 
      printf("READ: %i", numread); 
      bufpipe[numread+1] = '\0'; 
      memset(bufpipe,'\0',5001); 
      close(fd1); 
     } 
    } 

Répondre

6

Ce:

memset(bufpipe,'\0',5001); 

est un octet par écrasement, parce que vous avez seulement 5000 octets. Mais le principal "problème" est que read(..., 5000) lira toujours autant qu'il peut jusqu'à 5000 octets - vous semblez supposer qu'il lira seulement autant qu'il a été écrit en une seule fois par l'auteur, qui est pas vrai. Si l'auteur écrit deux paquets de 110 octets entre deux lectures, alors il est tout à fait correct que le lecteur lise 220 octets.

Si vous ne devez lire qu'un seul paquet à la fois, vous devez rendre vos paquets auto-descriptifs. Ainsi, par exemple, les quatre premiers octets contiennent le nombre d'octets à suivre. Ensuite, vous pouvez lire un seul paquet en lisant quatre octets, en le convertissant en entier, puis en lisant ce nombre d'octets de données.

+0

vous monsieur sont mes héros. Je n'aurais jamais pensé à ça, merci – whatWhat

1

Votre hypothèse selon laquelle un read exécutera immédiatement après un write n'est pas vrai. Le processus d'écriture peut écrire plusieurs fois sur le canal avant qu'une lecture ne soit détectée. Les données écrites seront ajoutées à la fin du tampon. Autrement dit, lire et écrire ne sont pas orientés paquet. Ils sont orientés flux. Cela signifie que write ajoute simplement des données à la mémoire tampon et que read obtient simplement n'importe quoi à sa disposition.

0

Comment synchronisez-vous avec le writer? Vous devez juste lire ce que vous attendez (spécifier 110 à lire())

+0

Y a-t-il un moyen de le faire sans savoir à quoi s'attendre? Le montant lu dans ce cas peut être de n'importe quel montant. C'est pourquoi je l'ai mis si haut à 5000 même s'il écrit seulement 110 – whatWhat

+0

Vous avez besoin de vos paquets pour inclure leur longueur au début, donc vous pouvez lire la longueur d'abord, puis le bon nombre d'octets pour obtenir le reste de ce single paquet. Voir ma réponse modifiée. – RichieHindle

Questions connexes