J'utilise appel select() pour détecter la présence d'entrée dans le cycle principal de mon programme. Cela me fait utiliser le descripteur de fichier brut (0) au lieu de stdin. En travaillant dans ce mode, j'ai remarqué que mon logiciel perd parfois une partie de l'entrée au début. Je soupçonne que stdin en consomme une partie au démarrage du programme. Est-il possible d'empêcher ce comportement de stdin ou d'obtenir toutes les données d'entrée?Comment empêcher le flux stdin de lire les données du descripteur de fichier associé au démarrage du programme?
L'effet décrit ne peut être reproduit qu'avec certaines données sur l'entrée standard au moment même du démarrage du programme. Mon exécutable doit être utilisé en tant que service xinetd de manière à avoir toujours une entrée au démarrage.
entrée standard est lu de la façon suivante:
Error processInput() {
struct timeval ktimeout;
int fd=fileno(stdin);
int maxFd=fd+1;
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
ktimeout.tv_sec = 0;
ktimeout.tv_usec = 1;
int selectRv=-1;
while ((selectRv=select(maxFd, &fdset, NULL, NULL, &ktimeout)) > 0) {
int left=MAX_BUFFER_SIZE-position-1;
assert(left>0);
int bytesCount=read(fd, buffer+position, left);
//Input processing goes here
}
}
Pouvez-vous poster du code pertinent? – Hasturkun
Un pseudocode a été ajouté pour illustrer un processus de lecture d'entrée. – Basilevs
Pourquoi même référence 'stdin' du tout? Pourquoi ne pas utiliser 'int fd = 0', ou peut-être' int fd = STDIN_FILENO'? –