glacote | Bonjour, j'ai écrit un script qui lit une chaîne au clavier mais s'interrompt au bout de 30s d'attente.
Ca marche comme je le veux, sauf si je redirige la sortie standard (avec un pipe | ou des back-quotes ``).
Ce que j'ai fait: passer le terminal en "raw":
Code :
- struct termios termio;
- if (fcntl(1, F_SETFL, fcntl(1,F_GETFL) | O_NONBLOCK ) < 0) fprintf(stderr, "WARNING: failed to open terminal in non-blocking mode\n" );
- if ( tcgetattr(1, &termio) < 0) fprintf(stderr, "WARNING: failed to get terminal mode\n" );
- cfmakeraw(&termio);
- if ( tcsetattr(1, TCSAFLUSH, &termio) < 0) fprintf(stderr, "WARNING: failed to set terminal into flushing mode\n" );
|
puis je lis caractère par caractère
Code :
- char* c = buffer;
- while ( (! has_timed_out) && (c < buffer + length) ) {
- struct pollfd pollee;
- pollee.fd = in;
- pollee.events = POLLIN;
- poll(&pollee, 1, -1);
- read(in, c, 1);
- if ( '\r' == *c) /* Return pressed; '\r' will be overwritten by a '\0' */
- break;
- else
- ++c;
- }
|
et enfin je restaure les paramètres du terminal
Code :
- tcsetattr(in, TCSAFLUSH, &original_termio);
|
Pourquoi est-ce que ça fonctionne quand je fait
mais pas quand je fais
Code :
- ./random-hash >> fichier
- ./random-hash | cat
- echo `./random-hash`
|
|