[megoldva] flush keyboard buffer (clear stdin)

Fórumok

Üdv,

Egy érdekes problémába futottam bele.

Egy script-em futása befejeztével szeretném törölni a billentyűzet pufferből a közben leütött billentyűket.

Itt egy példa:

sleep 10; echo vege

Ha a sleep futása közben leütök pár billentyűt, akkor az echo előtt kiíródnak a terminálba, és a script (parancsok) lefutása után is szintén kiíródnak az stdout-ra.

Van rá valami shell parancs, amit be tudnék szúrni a sleep után és az echo elé, ami kiürítené az input-ot? Legvégső megoldásban esetleg megírom C-ben, de jobban örülnék shell megoldásnak.

Köszi.

Hozzászólások

egyenlőre nem találom C-ben sem a megoldását a standard lib-ben.

fflush-sel próbálkoztam, nem jó.

fgets (..) kiüríti az stdin-t, de várni fog arra hogy enter-t üssek.

hmm, érdekes. csak meg lehet oldani valahogyan...?

végre megfogalmazódtak a kulcsszavaim a problémámra:

clear stdin

viszont neten azt írják, hogy ezzel végezhető el:

fflush (stdin)

ami viszont csak linux-on nem működik (ezt megerősítik). Borland C-ben megy. Esetleg valami ötlet?

elvben be lehet allitani az alacsonyszintu olvasas timeoutjat a stdin eseten is, igy, ha a read(2) fuggvenyt hasznalod, akkor ki lehet uriteni a puffert. Persze ehhez nem streaming olvasas kell. Esetleg meg lehet probalni a fread(3)-ot is, de nem tudom, hogy reagal.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Egyenlőre shell-ben néztem az általad javasolt timeout-ot, sajnos nem jó. A timeout lefut akár 0-val is (eddig jó lenne), de a sleep alatt beírt karakterek megjelennek az echo után még mindig.

sleep 5; read -t 0 X; echo OK

Sajna C-ben is eddig úgy találtam, hogy minden szépen és jól működik, csak az stdin mindig a kód lefutása után ürül ki, és nem előtte :)

Egyébként elég hosszú szálakat olvastam a neten erről, és trükközésekkel karakterenként olvastatják ki az stdin-t, de ENTER mindig kell és úgy ki is lehet üríteni! De nekem Enter ütése nélkül kellene.

Hogy hova kell az hosszú, lényeg hogy sok esethez kellhet, pl ha magam csinálok egy shell menüt és a kód egy részétől kezdve törölni szeretném a puffert, hogy ha véletlenül leütöttek egy Y-t az előző kód futása közben, akkor ez egy menü választásnál vagy kérdésnél ne legyen már automatikusan végrehajtva. Azt hiszem érthető :)

Azért köszi.

A

read -s

nem tudja benyelni? ha az aktivan fut a terminalon akkor "echo off"-ra allitja. nem nagyon mentem bele, de talan kiindulasnak jo lehet(?). c-ben biztos meg lehet csinalni, ioctl/termios/ncurses korul kell keresni (egyszer ma'r csinaltam 1000 eve, de szinte kizart hogy megtalalom a progit).

A.

Neked a tcflush()-ra van szükséged:


#define _XOPEN_SOURCE 500 /* SUSv2 */

#include <termios.h>      /* tcflush() */
#include <unistd.h>       /* STDIN_FILENO */
#include <stdlib.h>       /* EXIT_FAILURE */
#include <stdio.h>        /* perror() */

int main(void)
{
  if (-1 == tcflush(STDIN_FILENO, TCIFLUSH)) {
    perror("tcflush(STDIN_FILENO, TCIFLUSH)");
    return EXIT_FAILURE;
  }

  return EXIT_SUCCESS;
}

Használat:


sleep 10; echo vege; ./tcflush