Pb sur sigaction() et alarm() - C - Programmation
Marsh Posté le 10-11-2006 à 16:38:49
Quand tu ne mets pas en place le sigaction, ton signal SIGALRM n'est pas traité => terminaison de ton processus.
Quand tu mets en place ton sigaction, que fait ta fonction de traitement (act_time) ?
Marsh Posté le 10-11-2006 à 18:12:31
Elle affihe un message avec printf().J'ai resolu le pb de maniere suivante mais qui me parait peut eleguante:
[cpp]
sigjmp_buf reprise;
TIMEOUT()
{
printf("\nDelai d'attente depasse 30s d'ecoule" );
siglongjmp(reprise,1);
}
main(argc,argv)
{
struct sigaction act_time;
act_time.sa_handler=TIMEOUT;
act_time.sa_flags=0;
deblocage=sigaction(SIGALRM,&act_time,0);
if(sigsetjmp(reprise,1)==0)
{
while(connection!=0||var_etat==10)
{
connection=connect(socket1,(struct sockaddr*)&addr_distant,sizeof(addr_distant));
if(errno!=245&&errno!=244)
printf("\nvaleur de retour apres connect %d valeur de errno %s %d de var_etat=%d",connection,strerror(errno),errno,var_etat);
if(errno==234)
{
var_etat=alarm(0);
printf("\nconnection OK=%d valeur du timeout %d",connection=0,ETIMEDOUT);
}
}/*fin de tentative de Connection au point distant*/
}/* fin du sigsetjmp*/
}
Comment intercepter SIGALMR, lancer le gestionnaire de signaux mis en place et l'executer puis revenir dans le prog principal.
Marsh Posté le 10-11-2006 à 18:13:07
yartempion a écrit : Elle affihe un message avec printf().J'ai resolu le pb de maniere suivante mais qui me parait peut eleguante:
|
Marsh Posté le 13-11-2006 à 11:20:36
Essaie de t'inspirer de ça. Il s'agit du poly d'un de mes cours. L'exercice 16 correspond à ce que tu veux faire. Le corrigé de cet exercice est donné ici
Normalement, tu n'as pas besoin des setjmp / longjmps : lorsque ton processus reçoit un signal, le traitement normal est interrompu pour exécuter la fonction de traitement du signal, mais l'exécution reprend ensuite là où elle en était et continue normalement.
Marsh Posté le 15-11-2006 à 14:43:45
franceso a écrit : Essaie de t'inspirer de ça. Il s'agit du poly d'un de mes cours. L'exercice 16 correspond à ce que tu veux faire. Le corrigé de cet exercice est donné ici |
Bonjour,
En effet il n'y a pas besoin de saut de bloc.
Je faits appel a raise() pour envoyer au processus meme un signal SIGTERM de fin de process qui me cloture proprement le process.
Marsh Posté le 10-11-2006 à 15:34:10
Bonjour voici un bout de code qui me pose du souci:
Quand j'utilise alarm sans sigaction le code s'arrete si alarm est atteinte si je met en place un gestionnaire de signaux avec sigaction le prog s'arrete et la fenetre du terminal se ferme.
Pourquoi?