Hallo,
ich verzweifle an einem Problem mit select().
Ich nutze select() um abzufragen ob Kommandos in stdin warten, die ich
dann zeilenweise einlese und abarbeite. Das ganze funktioniert auch ganz
gut solange nur ein Kommando wartet.
Warten mehrere Kommandos in stdin (also auch mehrere Zeilen) passiert
folgendes:
- select() wird aufgerufen, gibt 1 zurück --> Kommandos warten
- die erste Zeile wird eingelesen und verarbeitet
- erneuter select()-Aufruf um auf weitere Kommandos zu prüfen
- select() gibt 0 (also keine weiteren Kommandos) zurück
Wenn ich stdin zeichenweise einlese liefert select() solange 1 bis ein
Zeilenumbruch gelesen wird.
Hier nochmal ein Minimalbeispiel:
1 | tv.tv_sec = 2;
|
2 | tv.tv_usec = 0;
|
3 | FD_ZERO(&fds);
|
4 | FD_SET(STDIN_FILENO, &fds);
|
5 | ret = select(STDIN_FILENO+1, &fds, NULL, NULL, &tv); // gibt 1 zurück
|
6 | fgets(buffer, 1024, stdin);
|
7 |
|
8 | tv.tv_sec = 2;
|
9 | tv.tv_usec = 0;
|
10 | FD_ZERO(&fds);
|
11 | FD_SET(STDIN_FILENO, &fds);
|
12 | ret = select(STDIN_FILENO+1, &fds, NULL, NULL, &tv); // gibt 0 zurück, auch wenn noch zeilen in stdin warten
|
13 |
|
14 | fgets(buffer, 1024, stdin); // <-- liefert nicht blockierend nächste Zeile
|
Ich würde ja alle Zeilen in stdin einfach auslesen und puffern, aber wie
soll ich rauskriegen wieviele Zeilen in stdin warten um kein
blockierendes fgets() aufzurufen.
Das ganz passiert unter Red Hat Linux 4.1.2-46 (Kernel
2.6.18_164.11.1.e15)
Schonmal vielen Dank für eure Hilfe!