select () ne répond pas à l’écriture sur / dev / input / mice

J’écris un programme qui surveille via select() les fichiers de périphérique du clavier et de la souris. Il attend toute opération d’écriture (cela devrait se produire lorsqu’il y a une frappe ou un mouvement de souris) sur ces fichiers et dès qu’il y a une opération d’écriture, certains travaux sont exécutés.

Mais ça ne marche pas. Mon code est donné ci-dessous.

 #include #include #include #include #include #include #include #include #include void main() { int mouse_fd,kbd_fd,fd_max; struct input_event ev; fd_set rfs,wfs; if((mouse_fd=open("/dev/input/event3",O_WRONLY))==-1) { printf("opening mouse device file has failed \n"); } else { printf("opening mouse device file has been successfull \n"); } if((kbd_fd=open("/dev/input/event2",O_WRONLY))==-1) { printf("opening keyboard device file has failed \n"); } else { printf("opening keyboard device file has been successfull \n"); } FD_ZERO(&rfs); FD_ZERO(&wfs); FD_SET(mouse_fd,&rfs); FD_SET(kbd_fd,&rfs); FD_SET(mouse_fd,&wfs); FD_SET(kbd_fd,&wfs); if(mouse_fd>kbd_fd) { fd_max=mouse_fd; } else { fd_max=kbd_fd; } while(1) { select((fd_max+1),&rfs,NULL,NULL,NULL); sleep(2); if(FD_ISSET(mouse_fd,&rfs)) { printf("test mouse \n"); } if(FD_ISSET(kbd_fd,&rfs)) { printf("test keyboard \n"); } } } 

Quand j’exécute le programme, il produit une sortie comme celle-ci

 [root@localhost Project]# gcc select.c [root@localhost Project]# ./a.out opening mouse device file has been successfull opening keyboard device file has been successfull test keyboard test keyboard test keyboard test keyboard test keyboard test keyboard test keyboard test keyboard test keyboard 

même si je n’appuie sur aucune touche. De plus, le fichier de périphérique de la souris n’est jamais sélectionné par select (), même s’il y a un mouvement physique de la souris.

Qu’est-ce que je fais mal?

    Vous devez réinitialiser vos ensembles fd avant chaque appel select . Ainsi, la boucle dans votre programme ressemblerait à ceci:

     while(1) { FD_ZERO(&rfs); FD_ZERO(&wfs); FD_SET(mouse_fd, &rfs); FD_SET(kbd_fd, &rfs); FD_SET(mouse_fd, &wfs); FD_SET(kbd_fd, &wfs); select((fd_max+1),&rfs,NULL,NULL,NULL); // proceed normally } 

    De plus, pour répondre au commentaire de l’utilisateur 1 sur votre même question sur Stack Overflow , vous devez ouvrir les périphériques en lecture, car vous essayez de lire leurs données:

     // Open device for reading (do you mean to use "/dev/input/mice" here?) if ((mouse_fd = open("/dev/input/event3", O_RDONLY)) == -1) 

    Linux inclut une page de manuel du tutoriel select_tut (2) avec des explications sur l’utilisation de select et un exemple de programme pouvant servir de référence. “Select Law” # 11 vous rappelle que vous devez réinitialiser vos ensembles fd avant chaque appel à select .