2017-06-30 3 views
0

J'ai essayé de faire des E/S non bloquantes avec stdin et un autre fd. Je les ai ajoutés à la bibliothèque de rouille mio, mais pendant le débogage avec strace, j'ai découvert qu'il s'agit d'un problème d'epoll.epoll retourne instantanément sur stdin

Lorsque j'ajoute stdin à epoll, l'epoll_wait retourne instantanément. Cela n'a pas d'importance si j'ai le shell/le terme connecté ou si j'utilise autre chose (par exemple cat).

Le code minimal C pour observer ceci:

#include <sys/epoll.h> 
#include <stdio.h> 
#include <unistd.h> 
int main(void) 
{ 
    char buffer[4096]; 
    int fd = epoll_create(5); 

    struct epoll_event event; 

    event.events = EPOLLIN; 
    event.data.fd = 0; 

    epoll_ctl(fd, EPOLL_CTL_ADD, 0, &event); 

    for (;;) { 
     fprintf(stderr, "Going into epoll_wait\n"); 
     epoll_wait(fd, &event, 1, 0); 
     fprintf(stderr, "Going into read: %d\n", event.data.fd); 

     printf("%ld\n", read(0, buffer, sizeof(buffer))); 
    } 
} 
+1

Vérifiez vos valeurs de retour! Toutes ces choses pourraient échouer et vous ne le sauriez jamais. –

+1

Définissez 'timeout' sur -1 plutôt que sur 0. Allez, c'est la première chose à faire - lire le manuel! –

Répondre

2

La valeur de délai d'attente sur 0epoll_wait() signifie: revenir immédiatement et seul rapport des événements en attente.

Vous devez spécifier la valeur de délai d'attente -1, ce qui signifie « attendre indéfiniment pour des événements »:

epoll_wait(fd, &event, 1, -1); 

Ensuite, il devrait fonctionner comme prévu.

+0

Bien, j'étais stupide. J'ai donc foiré mon test minimal. – Ongy

+0

@Ongy Peut-être que vous l'avez mélangé avec 'select()', où un paramètre de délai d'attente '0' (étant un pointeur NULL) signifie" attendre indéfiniment ". – Ctx

+0

Et je pense sondage aussi. Oui. Bien que la bibliothèque de rouille réelle que je veux utiliser, qui m'a amené dans cela fait correctement -1, c'était une erreur que j'ai faite dans mon code d'exemple. Je voulais l'afficher en tant que question séparée (sans faire référence au code que j'ai découpé), mais je dois attendre 90 minutes. – Ongy

1

man epoll_wait:

Spécifier un délai d'attente égal à zéro la cause epoll_wait() de revenir immédiatement.