Précédent   Forum des professionnels en informatique > Systèmes > Linux > Système
Système Vos questions autour de l'administration système
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/09/2011, 09h04   #1
Invité régulier
 
Inscription : août 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 6
Points : 9
Points : 9
Par défaut Interruption d'un programme par SIGINT

Bonjour,

Je souhaite executer un processus tournant en continu (boucle quasi infinie) jusqu'à ce que le signal SIGINT soit recu par mon processus. Cependant, Lorsque SIGINT est capturé par mon process, je souhaite uniquement modifier une variable permettant de quitter ma boucle infinie et revenir à ma fonction main. Pour l'instant, tous mes essais ont été infructueux, je ne retourne pas dans ma fonction main.

J'illustre ma description ci-dessous:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
 
int IsRunning;
 
void SortiePrecipitee (int signal){
 
	if (signal == SIGINT){
		IsRunning = 0;
	}
}
 
 
int main()
{
             /* configuration de la fonction en cas de ctrl -C */
	(void *)signal(SIGINT, SortiePrecipitee);
 
	IsRunning = 1;
 
	while(IsRunning == 1){
                 fonction1();				
	}
 
	fonction2();
	return 0;
}
Lorsque je tape CTRL-C dans ma console, je veux pouvoir revenir dans mon main et quitter normalement ma fonction. Pour l'instant fonction2 n'est jamais executée, je ne sais même pas ou part le programme une fois que FermeturePrecipitee est terminée. Tout ce que je sais c'est que je n'ai pas la main sur mon shell et que je suis obligé de tuer mon appli par la fonction KILL.

Je sais que j'aurai la possibilité d'éxécuter fonction2 dans mon handler FermeturePrecipitee, mais je ne souhaite pas le faire ainsi.

L'objectif final est de transformer le signal d'interruption par un nouveau signal que j'aurai défini moi même, lequel sera généré par un autre process.

Quelqu'un aurait une idée sur le déroulement des différents appels et comment faire pour modifier ma variable IsRunning dans mon handler puis revenir à mion main ?

Merci de votre aide

Nicolae
Nicolae est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/09/2011, 12h48   #2
Membre Expert
 
Homme
Ingénieur développement logiciels
Inscription : octobre 2008
Messages : 1 375
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : octobre 2008
Messages : 1 375
Points : 2 034
Points : 2 034
Est-ce que tu es sûr que fonction1() se termine ? autrement dit, est-ce que tu es sûr que tu parcours plus d'une fois ta boucle while ?

Tu devrais tester la valeur de retour de signal() pour détecter les cas d'erreur.

Ton programme n'est pas multi-threadé par hasard ?
matafan est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/09/2011, 15h35   #3
Invité régulier
 
Inscription : août 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 6
Points : 9
Points : 9
Merci pour ton intervention, mais je viens de voir ce qu'il se passait !!!

En fait, dans mon programme, je lisais le port série. Dans mon handler je fermais le port Série. et fonction2 avit pour mission de lire les dernières données qui étaient arrivées sur le port avant que je le ferme. Sauf que je l'avais déjà fermé du coup ma fonction read ne retournait jamais. et la commande Ctrl-C ne me permettait pas de reprendre la main sur le shell ...

C'etait une erreur d'algo. Je classe le post en resolu !

Nicolas
Nicolae est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h02.


 
 
 
 
Partenaires

Hébergement Web