Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2814 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Pb sur sigaction() et alarm()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pb sur sigaction() et alarm()

n°1473534
yartempion
Posté le 10-11-2006 à 15:34:10  profilanswer
 

Bonjour voici un bout de code qui me pose du souci:

Code :
  1. act_time.sa_handler=TIMEOUT;
  2. sigemptyset(&act_time.sa_mask);
  3. sigaddset(&act_time.sa_mask,SIGALRM);
  4. act_time.sa_flags=0;
  5. deblocage=sigaction(SIGALRM,&act_time,0);
  6. printf("\n var_etat %d avant et deblocage = %d",var_etat,deblocage);
  7. var_etat=alarm(10);
  8. while(connection!=0)
  9. {
  10. connection=connect(socket1,(struct sockaddr*)&addr_distant,sizeof(addr_distant));
  11. if (errno==EINPROGRESS)
  12. printf("\nDemande de connection en cours Changement de var_etat=%d\n",var_etat);
  13. if (errno==EALREADY)
  14. printf("\nvaleur de retour apres connect %d valeur de errno %s %d de var_etat=%d",connection,strerror(errno),errno,var_etat);
  15. if(errno!=245&&errno!=244)
  16. printf("\nvaleur de retour apres connect %d valeur de errno %s %d de var_etat=%d",connection,strerror(errno),errno,var_etat);
  17. if(errno==234)
  18. {
  19. alarm(0);


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?

mood
Publicité
Posté le 10-11-2006 à 15:34:10  profilanswer
 

n°1473594
franceso
Posté le 10-11-2006 à 16:38:49  profilanswer
 

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) ?


---------------
TriScale innov
n°1473675
yartempion
Posté le 10-11-2006 à 18:12:31  profilanswer
 

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.

n°1473676
yartempion
Posté le 10-11-2006 à 18:13:07  profilanswer
 

yartempion a écrit :

Elle affihe un message avec printf().J'ai resolu le pb de maniere suivante mais qui me parait peut eleguante:

Code :
  1. sigjmp_buf reprise;
  2. TIMEOUT()
  3. {
  4. printf("\nDelai d'attente depasse 30s d'ecoule" );
  5. siglongjmp(reprise,1);
  6. }
  7. main(argc,argv)
  8. {
  9. struct sigaction act_time;
  10. act_time.sa_handler=TIMEOUT;
  11. act_time.sa_flags=0;
  12. deblocage=sigaction(SIGALRM,&act_time,0);
  13. if(sigsetjmp(reprise,1)==0)
  14. {
  15. while(connection!=0||var_etat==10)
  16. {
  17. connection=connect(socket1,(struct sockaddr*)&addr_distant,sizeof(addr_distant));
  18. if(errno!=245&&errno!=244)
  19. printf("\nvaleur de retour apres connect %d valeur de errno %s %d de var_etat=%d",connection,strerror(errno),errno,var_etat);
  20. 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.


n°1474393
franceso
Posté le 13-11-2006 à 11:20:36  profilanswer
 

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.


---------------
TriScale innov
n°1475828
yartempion
Posté le 15-11-2006 à 14:43:45  profilanswer
 

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
 
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.


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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Pb sur sigaction() et alarm()

 

Sujets relatifs
[Fixed!][HTML] (Form) 'action' avec variables en GET ? (Pb) 
Plus de sujets relatifs à : Pb sur sigaction() et alarm()


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)