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)));
}
}
Vérifiez vos valeurs de retour! Toutes ces choses pourraient échouer et vous ne le sauriez jamais. –
Définissez 'timeout' sur -1 plutôt que sur 0. Allez, c'est la première chose à faire - lire le manuel! –