OVH Cloud OVH Cloud

pb avec select

2 réponses
Avatar
lud42fr
bonjour,
j'ai un probleme avec select,
je donne le code (c++) vite fait et je m'explique apres :
[code]

void* InternalThread::Entry()
{
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
FD_SET(fdToQuit, &rfds);
iTRACE("--THREAD RUN--");
int maxForSelect;
if(fd>fdToQuit)
maxForSelect=fd;
else
maxForSelect=fdToQuit;
while(1)
{
int rs=select(maxForSelect+1,&rfds,NULL,NULL,NULL);
if(FD_ISSET(fdToQuit,&rfds))
{
iTRACE("###############QUIT LA THREAD##############");
break;
}
if(FD_ISSET(fd,&rfds))
{
//do something here !!!
}
}
iTrace("THREAD QUIT");
}


void InternalReceiver::stop()
{
write(tab[1],"Q\n",2);
}

[/code]

donc j'ai une thread qui execute le code entry et mon prog principal qui
appel stop a un certain moment.

concernant le thread :
fd est le file descriptor d'un port serie.
fdToQuit est le file descriptor en lecture d'un PIPE
ce pipe sert a sortir de la fonction select (qui est/est doit
etre bloquante), tout ecriture dans le pipe devrait
reveiller le select (en theorie).

concernant InternalReceiver::stop:
ecrit juste dans le pipe;


ce code marche bien a condition de ne pas recevoir de caractere sur le
port serie (donc fd dans mon cas)
si je recois des caracteres sur le port serie alors toute ecriture sur
mon pipe n'est pas vu pas select !! et c'est la mon probleme !!
si quelqu'un a une idee, je suis preneur !

au passage si fdToQuit n'est plus un pipe mais un fichier alors select
n'est jamais bloquant et je rentre toujours dans
'if(FD_ISSET(fdToQuit,&rfds))', pourkoi ?
il me semble avoir lu un truc comme koi le caractere EOF rend select non
bloquant! - comment passer outre ?


merci
ludo

2 réponses

Avatar
ludonews
lud42fr wrote:

bonjour,
j'ai un probleme avec select,
[snip]

si je recois des caracteres sur le port serie alors toute ecriture sur
mon pipe n'est pas vu pas select !! et c'est la mon probleme !!
si quelqu'un a une idee, je suis preneur !
Quel OS , Quel Architecture Hardware ?


--
http://perso.hirlimann.net/~ludo/blog/

Avatar
maaxx
Salut,

Je pense qu'il te faudrait reinitialier ton masque rfds avant le select car
il est modifie à chaque sortie de slect (la preuve tu le testes)
Essaie:
..............
while(1)
{
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
FD_SET(fdToQuit, &rfds);
int rs=select(maxForSelect+1,&rfds,NULL,NULL,NULL);
..............................
M.
"lud42fr" a écrit dans le message news:
bk9ne8$fdd$
bonjour,
j'ai un probleme avec select,
je donne le code (c++) vite fait et je m'explique apres :
[code]

void* InternalThread::Entry()
{
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
FD_SET(fdToQuit, &rfds);
iTRACE("--THREAD RUN--");
int maxForSelect;
if(fd>fdToQuit)
maxForSelectý;
else
maxForSelectýToQuit;
while(1)
{
int rs=select(maxForSelect+1,&rfds,NULL,NULL,NULL);
if(FD_ISSET(fdToQuit,&rfds))
{
iTRACE("###############QUIT LA THREAD##############");
break;
}
if(FD_ISSET(fd,&rfds))
{
//do something here !!!
}
}
iTrace("THREAD QUIT");
}


void InternalReceiver::stop()
{
write(tab[1],"Qn",2);
}

[/code]

donc j'ai une thread qui execute le code entry et mon prog principal qui
appel stop a un certain moment.

concernant le thread :
fd est le file descriptor d'un port serie.
fdToQuit est le file descriptor en lecture d'un PIPE
ce pipe sert a sortir de la fonction select (qui est/est doit
etre bloquante), tout ecriture dans le pipe devrait
reveiller le select (en theorie).

concernant InternalReceiver::stop:
ecrit juste dans le pipe;


ce code marche bien a condition de ne pas recevoir de caractere sur le
port serie (donc fd dans mon cas)
si je recois des caracteres sur le port serie alors toute ecriture sur
mon pipe n'est pas vu pas select !! et c'est la mon probleme !!
si quelqu'un a une idee, je suis preneur !

au passage si fdToQuit n'est plus un pipe mais un fichier alors select
n'est jamais bloquant et je rentre toujours dans
'if(FD_ISSET(fdToQuit,&rfds))', pourkoi ?
il me semble avoir lu un truc comme koi le caractere EOF rend select non
bloquant! - comment passer outre ?


merci
ludo