Tastatur ueber device lesen



  • moin moin,
    wahrscheinlich ist das jetzt eine DAU frage aber ich kann es nicht aendern.
    ich habe ein programm geschrieben, das diverse tcp-sockets bearbeitet. mittels einer select anweisung idlet das programm vor sich hin. so weit, so gut.
    nun moechte ich noch etwas 'human interaction' einbauen. soll heissen, ich will die tastatur auch in die select routine einbauen.

    welches device ist die tastatur?



  • Tagchen,

    dieselbe Frage hat sich mir gestern auch gestellt. Eine Antwort spuckt google nicht aus, aber ein Workaround für meine Zwecke tut's auch, nur kann ich über die Portabilität nichts aussagen.

    Ich habe eine zweite PS/2-Tastatur an den Mausanschluss gehängt. Mittels open("/dev/psaux", O_RDWR) lässt sich die Tastatur "öffnen" und read() liefert immer genau 1 Zeichen zurück, das man als int betrachten sollte, also ihren numerischen Wert. Blöd ist nur, dass ein normaler User auf /dev/psaux nicht zugreifen darf. Naja, das hab ich kurzer Hand mit chmod a+rw /dev/psaux geändert. Oder du lässt dein Programm als root laufen.

    Wahrscheinlich nicht, aber vllt. kannst du damit was anfangen.

    Ben



  • stdin hat den Filedescriptor 0. Siehe auch das Beispiel zu man: man select.



  • DrGreenthumb schrieb:

    stdin hat den Filedescriptor 0. Siehe auch das Beispiel zu man: man select.

    Schön und gut, aber select meldet sich nur, wenn der User seine Eingabe mit einem CR abgeschlossen hat.

    Den Filedescriptor zu einem FILE struct bekommst du von fileno(FILE *file), in diesem Fall also:

    #include <stdio.h>
    ...
    int fd_stdin=fileno(stdin);



  • Saraneus schrieb:

    DrGreenthumb schrieb:

    stdin hat den Filedescriptor 0. Siehe auch das Beispiel zu man: man select.

    Schön und gut, aber select meldet sich nur, wenn der User seine Eingabe mit einem CR abgeschlossen hat.

    davon hast du ja erst nichts gesagt. Das lässt sich mit tcsetattr abstellen (ICANON entfernen).



  • Da gebe ich dir Recht 🙂 Ich bin übrigens nicht der Fragesteller.

    Lässt sich tcsetattr auch mit Daemons anwenden, die die Tastatureingabe egal welchen ttys mitlesen sollen? Nach einer solchen Möglichkeit suche ich schon lange.



  • also ich hab auch so ein multi-user-chat programm gebastelt um in netzwerk-programmierung nen bisschen rein zu kommen und sitz nu auch bei dem problem mit der tastatur.
    ich habe schon die 0 ins FD_SET aufgenommen und er ruft auch die zuständige prozedur zum verarbeiten der tastatureingabe auf. jedoch hab ich probleme damit, zu gucken, was eingegeben wurde. wie bei anderen connections über recv einzulesen, um dann zu gucken was in der variablen drinsteht, scheint es nicht zu funktionieren.



  • Deine Fehlerbeschreibung ist zu vage. Musst schon mehr eingrenzen und den Effekt genauer beschreiben. Codezeilen wären natürlich zusätzlich interessant.



  • also erstma nen bisschen code:

    void KeyboardInput(int i) //Prozedur, die aufgerufen wird, wenn über select
    {                               //"gemeldet" wurde, dass über die Tasta was
                                    //reinkommt. i ist hierbei 0 für den Standartinput.
    	int get = recv(i, buffer, 1000, 0);
    	buffer[get] = '\0';  //buffer is deklariert als char* buffer; und mit
                                 //buffer = new char[1000]; initialisiert.
    	cout << "buffer=" << buffer << " (" << get << ")" << endl; //zu Testzweckn
    	Ende = true;  //ich hab in main() ne while-schleife, die hierbei abbricht
                          //sollte später natürlich nur gesetzt werden, wenn man
                          //"exit" eingegeben hat.
    	if (buffer == "exit")   //then-teil wird nicht aufgerufen
    	{
    		Ende = true;
    	};
    };
    

    also wie oben schon gesagt, wird der then-teil nich aufgerufen. recv liefert immer -1.
    hoffe das war ausführlich genug 😃
    bei unklarheiten bitte fragen.



  • Warum erstellst du nicht einen neuen Thread wo du nur die Netzwerksachen laufen lässt? Im Hauptthread kann doch die Tastatatur bearbeitet werden.



  • von threads hab ich noch nie was gehört.. aber ich werd mal danach googlen 🙂
    danke



  • also ich hab mich da jetz ma schlau gemacht und funzt auch soweit ganz gut. jedoch muss ich eine variable haben, deren aktuellen zustand beide threads abrufen können und bei einer änderung darauf reagieren.
    nun hab ichs schon mit einer globalen variable und nem pointer versucht, der an beide threads übergeben wird.
    beides scheint nicht so recht funktionieren zu wollen.
    wie könnte man dieses problem lösen?


Anmelden zum Antworten