2016-03-17 1 views
1

J'essaye de lire une FIFO en arrière-plan (en utilisant un thread) pendant que mon programme principal tourne dans une boucle infinie. Je veux utiliser select() car sinon le processeur tourne à 100%, mais le example que j'ai trouvé ne fonctionne pas. Voici le code exemple:Lecture continue de FIFO en utilisant select()

#include <stdio.h> 
#include <string.h> 
#include <fcntl.h> 
#include <sys/select.h> 
#include <sys/stat.h> 
#include <unistd.h> 

int main() 
{ 
    mkfifo("FIFO", 0666); 

    fd_set readCheck; 
    fd_set errCheck; 
    char buffer[64]; 
    struct timeval timeout; 
    int rv; 

    int fd = open("FIFO", O_RDONLY | O_RSYNC); 

    FD_ZERO(&readCheck); 
    FD_ZERO(&errCheck); 

    while (1) { 
     FD_SET(fd, &readCheck); 
     FD_SET(fd, &errCheck); 

     timeout.tv_sec = 1; 
     timeout.tv_usec = 0; 

     rv = select(fd, &readCheck, NULL, &errCheck, &timeout); 
     if (rv < 0) { 
      printf("Select failed\r\n"); 
      break; 
     } 

     if (FD_ISSET(fd, &errCheck)) { 
      printf("FD error\r\n"); 
      continue; 
     } 

     if (FD_ISSET(fd, &readCheck)) { 
      memset(buffer, 0, sizeof(buffer)); 
      rv = read(fd, buffer, sizeof(buffer)); 
      if (rv < 0) { 
       printf("Read failed\r\n"); 
       break; 
      } 
      printf(buffer); 
      buffer[64] = '\0'; 
     } 
    } 
    close(fd); 

    return 0; 
} 

Quand j'écris rien de fichier FIFO se produit, mais en utilisant cat FIFO imprime le contenu. Quel peut être le problème?

+0

Veuillez fournir un lien vers la spécification de ce langage "C/C++"! Unteil alors il n'y a que les deux ** langages ** différents C et C++. – Olaf

Répondre

2

Vous devez donner le premier argument comme l'un plus élevé que le dernier descripteur de fichier ouvert. A partir de la page d'homme de select,

nfds est le descripteur de fichier numéro le plus élevé dans l'un des trois ensembles, plus 1

Modifier cette ligne,

rv = select(fd, &readCheck, NULL, &errCheck, &timeout); 

à

rv = select(fd+1, &readCheck, NULL, &errCheck, &timeout); 

Si vous ne le mentionnez pas, alors sélectionnez ne c Vérifiez votre descripteur afin que le descripteur de fichier ne soit pas prêt à être lu.

+0

Ça a marché, merci. –

1

Votre tampon est déclarée comme

char buffer[64]; 

utilisant

buffer[64] = '\0'; 

vous écrivez en dehors des limites.

changement

buffer[64] = '\0'; 

à

buffer[rv] = '\0';