fileno(stdin) liefert -1 mit errno 9 (EBADF) nach 5-6 Verwendungen



  • Hallo c-community,

    ich habe eine Frage zu einem "komischen" Verhalten von fileno(stdin). Ich verwende die Standard-Funktionen unter Linux um Tastendrücke abzufangen:

    getCH

    int     getCh(void){
        int ch = -1, fd = 0;
        struct termios neu, alt;
        fd = fileno(stdin);
        tcgetattr(fd, &alt);
        neu = alt;
        neu.c_lflag &= (unsigned)~(ICANON);
        neu.c_lflag &= (unsigned)(ECHO);
        tcsetattr(fd, TCSANOW, &neu);
        ch = getchar();
        tcsetattr(fd, TCSANOW, &alt);
        return ch;
    }
    

    kbHit

    int     kbHit(void){
        int ch = -1, fd = 0;
        struct termios neu, alt;
        fd = fileno(stdin);
        tcgetattr(fd, &alt);
        neu = alt;
        neu.c_lflag &= (unsigned)~(ICANON|ECHO);
        tcsetattr(fd, TCSANOW, &neu);
        ch = getchar();
        alt.c_lflag &= (unsigned)(ECHO);
        tcsetattr(fd, TCSANOW, &alt);
        if (ch != -1){
            ungetc(ch, stdin);
            return 1;
        }
        return 0;
    }
    

    Diese werden in einer einfachen while-Schleife verwende:

    int running = 1;
    while(running){
        if(kbHit){
            char c = (char)getCh;
            switch(c){
                case Fall1:
                    // do something
                    break;
                case Fall2:
                    // do something else
                    break;
                case    'q':
                case    'Q':
                    running = 0;
                    break;
                default:
                    // do nothing
                    break;
            } 
        }
    }
    

    Jetzt kommt es bei der Verwendung dazu, dass mit fileno(stdin) ein -1 zurückliefert und der errno auf 9 EBADF - Bad file number gesetzt wird.

    Wie kann das passieren?

    MfG
    mirrowwinger



  • Für diese Unix-Frickelei gibts fertige Bibliotheken, ebenso wie es hier das richtige Subforum gibt.



  • Wutz schrieb:

    Für diese Unix-Frickelei gibts fertige Bibliotheken, ebenso wie es hier das richtige Subforum gibt.

    Ok den Hinweis zum Forum muss ich hin nehmen. Leider ist nicht immer eindeutig wo die Grenze Linux - C ist (hängt ja doch zusammen). Hoffe es ist ok, wenn die Frage hier weiter läuft, sonst bitte ich den Threat zu verscheiben.

    Ja ich weiß, es gibt ncurses aber das ist nicht meine Frage. Mir ist das oben angegebene Problem aufgefallen und ich suche unabhängig zu anderer Meinungen "bessere" Lösung EINE PASSENDE! ANTWORT, warum fileno(stdin) als -1 mit EBADF auftreten kann.



  • mirrowwinger schrieb:

    Leider ist nicht immer eindeutig wo die Grenze Linux - C ist (hängt ja doch zusammen).

    Hier ist es recht eindeutig.
    Die Funktionen und structs die du da benutzt sind nicht im Standard von C definiert. Nicht umsonst steht da noch was in Klammern im Unterforentitel.

    Zum Problem:

    Warum benutzt du nicht STDIN_FILENO ?



  • Ah das kann ich mal tun. Verwendet hab ich das noch nicht, weil ich es gar nicht kannte. Werde es gleich mal testen.

    Danke DirkB.



  • fileno sagt dir mit EBADF nur, dass der Stream ungültig ist. Es macht den Stream nicht selbst ungültig, das muss eine andere Ursache haben.


Anmelden zum Antworten