Nicht Blockierende Charakter Bekommen

  • Plattform: Linux 3.2.0 x86 (Debian 7)
  • Compiler: GCC 4.7.2 (Debian 4.7.2-5)

Schreibe ich eine Funktion, liest ein einzelnes Zeichen von der Standardeingabe, wenn ein Charakter bereits in stdin. Wenn stdin ist leer, die Funktion wird angenommen, nichts zu tun und -1 zurückgeben. Ich gegoogelt nonblocking-Eingang und auf die verwiesen wurde, poll() oder wählen Sie(). Zuerst habe ich versucht zu verwenden, wählen Sie (), aber ich konnte nicht bekommen es zu arbeiten, also versuchte ich, poll() und kamen zu dem gleichen Schluss. Ich bin nicht sicher, was diese Funktionen tun genau das, aber von dem, was ich verstehe, von poll()'s-Dokumentation, wenn ich rufe es so auf:

struct pollfd pollfds;
pollfds = STDIN_FILENO;
pollfds.events = POLLIN;
poll(pollfds, 1, 0);

wenn(pollfds.revents & POLLIN) wird wahr, wenn "andere Daten als high-priority-Daten können gelesen werden ohne zu blockieren.". Aber poll() immer mal in meiner test-situation. Wie Teste ich die Funktion könnte das problem sein, aber die Funktionalität, die ich will, ist genau das, was ich am testen für. Hier ist die Funktion aktuell und der test-situation als gut.

#include <poll.h>
#include <stdio.h>
#include <unistd.h>

int ngetc(char *c)
{       
    struct pollfd pollfds;
    pollfds.fd = STDIN_FILENO;
    pollfds.events = POLLIN;

    poll(&pollfds, 1, 0);

    if(pollfds.revents & POLLIN)
    {
            //Bonus points to the persons that can tell me if
            //read() will change the value of '*c' if an error
            //occurs during the read
        read(STDIN_FILENO, c, 1);
            return 0;
    }
    else return -1;
}

//Test Situation:
//Try to read a character left in stdin by an fgets() call
int main()
{
    int ret = 0;
    char c = 0;
    char str[256];

    //Make sure to enter more than 2 characters so that the excess
    //is left in stdin by fgets()
    fgets(str, 2, stdin);

    ret = ngetc(&c);

    printf("ret = %i\nc = %c\n", ret, c);

    return 0;
}
  • stackoverflow.com/questions/3962263/...
  • Ihre Funktion niemals 0 zurückgeben : if ( ... ) return errno; else return EWOULDBLOCK; ; gut, was ist der Einsatz für die letzten zurück ?
  • wenn ein Fehler Auftritt, während Sie das Lesen, wird die Funktion return errno aber wenn ein Fehler nicht auftreten, während der Lektüre die Funktion 0 zurück. Die Anweisung beginnt mit der überprüfung, um zu sehen, ob Daten in der Standardeingabe, wenn keine Daten die Anweisung Kurzschlüsse, bevor read() wird aufgerufen, aber wenn es Daten in der Standardeingabe read() wird aufgerufen, und wenn read() liefert eine -1, dann ein read error occured also return errno ansonsten, wenn keine lese-Fehler tritt auf, dann ist die Bedingung false, so wird 0 zurückgegeben.
  • ich meinte : es sieht aus wie das Letzte return 0 wird nur ein unreachable code durch if () return A; else return B; Muster.
  • Oh ja, ich weiß, was du meinst, es sieht ein wenig umständlich
Schreibe einen Kommentar