PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] non-blocking stdin



deki
21-12-2004, 21:52
Hallo!

Ich suche eine Möglichkeit STDIN auf non-blocking zu schalten, d.h. wenn ich mit read() von STDIN auslese sollte sofort jedes Zeichen ausgelesen werden.
(Ähnlich wie getch() unter ncurses.)

Über google habe ich schon gefunden, dass man über fcntl() fds in den non-blocking Modus schalten kann.

Leider funktioniert das nicht.
Hier das Test-Programm, das eigentlich funktionieren müsste, es aber nicht tut: ;)

#include <unistd.h>
#include <fcntl.h>

int main ()
{
char c;
fcntl (0, F_SETFD, O_NONBLOCK);
read (0, &c, 1);
return 0;
}
Das Programm beendet erst nach der Eingabe von einem Newline Zeichen.

Wäre nett, wenn mir jemand helfen könnte :D

MfG
deki

PS: Ich habe meine Gründe, warum ich ncurses und Co. nicht verwenden kann....

wraith
21-12-2004, 22:43
Deinem Code nach willst du das:


#include <unistd.h>
#include <fcntl.h>

int main()
{
int opts;
char c;

opts = fcntl(STDIN_FILENO, F_GETFL);
fcntl(STDIN_FILENO, F_SETFL, opts | O_NONBLOCK);

read(0,&c,1);
}

Deiner Erklärung nach das:


#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>

int main()
{
char c;
struct termios tio;

tcgetattr(fileno(stdin), &tio);
tio.c_lflag &= ~ICANON;
tcsetattr(fileno(stdin), TCSANOW, &tio);

read(0,&c,1);
}

deki
22-12-2004, 10:59
Super, das Zweite ist genau das, das ich gesucht habe! :D
Vielen dank!

Joghurt
22-12-2004, 14:18
JFYI, fileno(stdin) ist immer 0, für die Schreibfaulen unter uns ;)