Stdin figyelése bemenetre várás nélkül

Fórumok

Hello!

Az lenne a kérdésem, hogy milyen (esetleg ANSI) módon lehet megoldani, hogy a program futása közben a getc(stdin)-hez hasonlóan figyeljem a leütött karakter(eke)t, de úgy, hogy a program ne várja meg, amíg kap valami inputot, csak egyszerűen nézze meg, hogy volt-e input adott pont óta és ha nem, akkor folytatódjon a futás.

Köszönöm, bye: night[w]

Hozzászólások

Szia!

Erre két módszer is létezik. Az egyik, hogy pollozod a bemenetet (man 2 poll) és csak akkor hívod meg a getc()-t, ha történt valami esemény a bemeneten. A másik lehetőség pedig az, hogy a bemenetet non-blocking üzemmódba teszed (fcntl(0, F_SETFL, O_NONBLOCK)) ekkor a getc() azonnal vissza fog térni, a visszatérési érték szerintem EOF lesz, de ebben nem vagyok maradéktalanul biztos.

Sokat kerestem utána, egyértelműen csak operációs rendszer függő megoldás létezik. Ez linux specifikus. Van olyan módszer, ami csak header fileokban tér el a különböző rendszereken? Vagy legalábbis a lehető legminimálisabban? Mert windows-on a linker undefined referencet ad vissza ictlsocket(windows-os megfelelő)-re Code::Blocks és Dec-C++ alatt is(minden header file be van includolva). fcntl-re meg az F_SETFL-nél dobja, hogy nem ismeri ezt a függvényt és nem fordul le(fcntl.h es winioctl.h includolva van). Jó lenne valami olyan megoldás, ami winen is működik.

Bye: night[w]

Mire kell ez az egesz? Ugyertem, pl. linux/unix alatt a terminal alapertelmezesben sorbufferelt, igy pl. akkor nem mutatnak a standard megoldasok (pl. poll(), select()) kiolvashato input-ra utalo nyomokat, ha van adat, csak nem zartad le a sort (\n-nel).

erdemes talan megnezni az ncurses-t is. eleg egyszeru, ha effele alapszintu "interaktiv" programokat akar csinalni az ember, es ez me'g a terminal buffereleset is kezeli (amit ugyan sima fgetc/read/select-tel is megoldhatsz, hogyha elotte egy rakas termios-ioctl-t raengedsz a terminalra). es ez is viszonylag "standard", pl. a regi szep DOS-os idokben is szinte ugyanigy 1:1-ben kellett "konzolt" kezelni (lasd regi #include <conio.h>-s programok).

Egy primko pelda:


/* compile: `cc ncurses-getch.c -o ncurses-getch -lncurses` */

#include <stdio.h>
#include <ncurses.h>

int main(int argc,char *argv[])
{
 int    ch;

 initscr(); 
 noecho();

/* nodelay(stdscr,TRUE); */

 while ( 1 ) 
  {     ch=getch();
        fprintf(stdout,"Read: %d (%.2x) '%c'\r\n",ch,ch,ch);
        /*printf("Read: %d (%.2x) '%c'\r\n",ch,ch,ch);*/
        fflush(stdout);
  };

 return(0);
}

én libevent-et használtam ilyenre, az platform-független, ráadásul nagyon gyors is.