Ü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.
- 2050 megtekintés
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...?
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
Mar nagyon reg nem programoztam C-ben, de ha jol tudom ANSI C-ben mukodik az egyszeru flush(), parameter nelkul, de lehet hogy csak rosszul emlekszem...
- A hozzászóláshoz be kell jelentkezni
sima flush() függvény nincs, fflush()-t meg nem engedi paraméter nélkül, úgyhogy sajna nem működik.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
A read persze benyeli, csak a probléma az, hogy ENTER leütésre vár.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Ill. ha menet közben ki akarod kapcsolni az echo-t, akkor
stty -echo
csak ne felejts el a script-edbe megfelelő EXIT trap-et rakni, ami visszaállítja.
Hozzávetőleg
stty -echo \
&& sleep 3 \
&& echo vege \
&& stty echo \
&& ./tcflush
- A hozzászóláshoz be kell jelentkezni
Ez így tökéletes és működik úgy ahogy szerettem volna.
Nagyon köszönöm. :)
- A hozzászóláshoz be kell jelentkezni
Azt el lehet mondani, hogy az elso #define miert kell? Puszta emberi kivancsisag...
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni