SIGIO handler, pb lecture sur /dev/ir

Fermé
AirSeb - 26 mars 2009 à 15:37
 AirSeb - 26 mars 2009 à 16:33
Bonjour,
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

dubcek Messages postés 18765 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 20 février 2025 5 624
26 mars 2009 à 16:16
hello
la redéfinition de int wait_flag=TRUE; dans le main ?
0
c'est juste une initialisation.
le pb vient de la ?
0