Signal_handler pb sur lecture de /dev/ir

Fermé
AirSeb - 26 mars 2009 à 14:27
mamiemando Messages postés 33643 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 avril 2025 - 27 mars 2009 à 00:53
Bonjour,
J'ai créé un programme en C pour lire au fil de l'eau des infos sur le port Infrarouge d'un PC sous linux (DEBIAN). Tout fonctionne correctement quand je fais un boucle sans fin read() pour lire les infos sur le /dev/ir.
En revanche pour optimiser le code et eviter la boucle infinie read(), je voulais utiliser les signaus SIGIO du kernel pour réveiller mon programme et ne faire la lecture qu'à ce moment là.
J'ai donc créé le programme ci-dessous utilisant cette fonctionnalité , mais mon programme ne se réveille jamais et ne semble donc pas recevoir les signaux SIGIO et j'avoue qu'après avoir pas mal cherché sur le net, je ne vois pas d'où vient le pb.
voici mon code :
------------------------------------------------------------------------------------------------------------------------------
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/user.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <termios.h>
#include <pthread.h>
#include <time.h>
#include <sys/signal.h>

#define FALSE 0
#define TRUE 1
int wait_flag=TRUE;

void signal_handler_IO (int status)
{
printf("reception du signal SIGIO.\n");
wait_flag = FALSE;
}

int main(int argc, char *argv[])
{
char tampon[100];
char tampon_old[100];
int nb_lus;
struct sigaction saio;
int wait_flag=TRUE;

int fd; /* File descriptor for the port */

fd = open(argv[1],O_RDONLY |O_NONBLOCK);
if (fd == -1)
{
printf("open_port: Unable to open /dev/ttyS0 - \n");
}
else {
printf("open port sucessful !!\n");
saio.sa_handler=signal_handler_IO;
sigemptyset(&saio.sa_mask);
saio.sa_flags=0;
saio.sa_restorer=NULL;
if (0>sigaction(SIGIO,&saio,NULL))
{printf("error init sigaction !!\n");}
else {printf("init sigaction ok !!\n");}
if (0>fcntl(fd, F_SETOWN, getpid()))
{ printf("error fcntl !!!\n");}
else {printf("ok for fnctnl\n");}

while (1){
usleep(100000);
if (wait_flag==FALSE) {
if (read(fd,tampon,sizeof(tampon))!=-1){
printf("read k, len buffer:%d\n",sizeof(tampon));
printf("buffer:%s\n",tampon);
}
else {printf("error lecture sur /dev !!\n");}
wait_flag=TRUE;
}
}
}
return (fd);
}
----------------------------------------------------------------------------------------------------------------------
je lance mon programme comme ceci :# ./monprog /dev/ir
tout se passe correctment pour les intialisations, je n'ai aucune erreur, même au niveau de l'initialisation du SIGIO handler. mais mon programme n'affiche plus rien du tout.

merci de votre aide.

AirSeb
A voir également:

1 réponse

mamiemando Messages postés 33643 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 avril 2025 7 845
27 mars 2009 à 00:53
Tu devrais t'inspirer du code source de irw, et pour celà récupérer les sources de lirc.
https://www.lirc.org/html/irw.html

Pour ça je pense qu'il suffit d'installer le paquet lirc-modules-source et d'ouvrir l'archive /usr/src/lirc-modules.tar.bz2. Si tu souhaites installer le paquet pour tester irw
http://www.commentcamarche.net/faq/sujet 16638 configurer sa carte tv et sa telecommande sous linux#a installation de lirc

Bonne chance
0