Redirection des I/O et lecture du clavier

Redirection des I/O et lecture du clavier - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 31-01-2005 à 14:44:28    

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 :
  1. struct termios termio;
  2.   if (fcntl(1, F_SETFL,  fcntl(1,F_GETFL) | O_NONBLOCK ) < 0) fprintf(stderr, "WARNING: failed to open terminal in non-blocking mode\n" );
  3.   if ( tcgetattr(1, &termio) < 0) fprintf(stderr, "WARNING: failed to get terminal mode\n" );
  4.   cfmakeraw(&termio);
  5.   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 :
  1. char* c = buffer;
  2.   while ( (! has_timed_out) && (c < buffer + length) ) {
  3.     struct pollfd pollee;
  4.     pollee.fd = in;
  5.     pollee.events = POLLIN;
  6.     poll(&pollee, 1, -1);
  7.     read(in, c, 1);
  8.     if ( '\r' == *c) /* Return pressed; '\r' will be overwritten by a '\0' */
  9.       break;
  10.     else
  11.       ++c;
  12.   }


et enfin je restaure les paramètres du terminal

Code :
  1. tcsetattr(in, TCSAFLUSH, &original_termio);


 
Pourquoi est-ce que ça fonctionne quand je fait

Code :
  1. ./random-hash


mais pas quand je fais

Code :
  1. ./random-hash >> fichier
  2. ./random-hash | cat
  3. echo `./random-hash`

Reply

Marsh Posté le 31-01-2005 à 14:44:28   

Reply

Marsh Posté le 31-01-2005 à 16:19:13    

up

Reply

Marsh Posté le 31-01-2005 à 16:24:37    

mauvaise cat, prog est plus adaptée :)


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 31-01-2005 à 16:39:56    

black_lord a écrit :

mauvaise cat, prog est plus adaptée :)


Merci, j'ai reposté ici.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed