Faire remonter une valeur avec un signal

Résolu
Cedric477 Messages postés 6 Date d'inscription mercredi 18 novembre 2009 Statut Membre Dernière intervention 8 février 2012 - 30 janv. 2012 à 15:55
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 1 févr. 2012 à 15:00
Bonjour à tous,

J’espère être dans la bonne section pour créer ce topic.

J'ai bien cherché sur internet, mais je n'ai rien trouvé de concluant...

Voila mon problème :
J'ai un programme qui fork un certain nombre de fois, selon une architecture en ligne (Le premier père fait un fils, qui fait à son tour un fils...).
Chaque processus communique avec ses voisins (père et fils) au travers d'un tube (un tube vers le père, et un tube vers le fils).
Le premier père envoi une valeur à son fils, qui l'envoi alors a son fils après avoir fait un calcul avec cette valeur, et ainsi de suite jusqu'au dernier processus.
Mon problème est que je souhaite faire remonter un signal jusqu'au premier père lorsqu'un fils génère une erreur lors de son calcul, avec le pid du processus causant l'erreur.
J'arrive bien a faire remonter le signal, mais je ne trouve pas le moyen de remonter le pid avec le signal.

Je crois qu'il est faisable de faire remonter un entier avec un signal BSD ou POSIX, quelqu'un a-t-il une idée ?

Merci pour votre aide!

5 réponses

Cedric477 Messages postés 6 Date d'inscription mercredi 18 novembre 2009 Statut Membre Dernière intervention 8 février 2012
1 févr. 2012 à 14:44
Re!

Comme promis voila des bouts de code pour illustrer mes propos.
Je défini mon gestionnaire de cette façon :

struct sigaction act;
act.sa_sigaction = &remonte_pere; //On définit le handler
act.sa_flags = SA_SIGINFO;

sigaction(SIGUSR1, &act, NULL); //On gere le signal SIGUSR1

Je lance le signal (avec la valeur a remonter) ou je veux, et de cette façon :

void lance_signal ()
{
union sigval mon_union; //Définit dans signal.h
mon_union.sival_int = valeur_a_remonter;
sigqueue(pid_du_proc, SIGUSR1, mon_union);
/* Equivalent a kill(pid_du_proc, SIGUSR1); sauf que l'on remonte la valeur sival_int dans mon_union */
}

Le handler remonte_pere a alors la tête suivante :

static void remonte_pere (int signal, siginfo_t *siginfo, void *context)
{
printf("Valeur remontee : %d\n", siginfo->si_value.sival_int);
/* si_value est l'union mon_union de la fonction lance_signal passée en parametre dans le sigqueue() */
}

Voila, en esperant que ça puisse servir !

Have fun!
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
30 janv. 2012 à 16:21
Bonjour.

Je ne comprends pas ton besoin. Lorsque tu forks, le père obtient alors le pid du fils (sinon tu ne pourrais pas faire de waitpid). Donc le problème ne se pose pas, non ?
Sinon, tu peux feinter et faire remonter un numéro d'erreur qui contient le pid (pas très beau, certes).
Du genre: retour de 2 + pid => retour + pid * 1000;
Et à la reception: pid retour / 1000 et res retour % 1000;

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
Cedric477 Messages postés 6 Date d'inscription mercredi 18 novembre 2009 Statut Membre Dernière intervention 8 février 2012
30 janv. 2012 à 16:47
Bonjour CptPingu, et merci pour ta réponse !

En réalité ce que je souhaite faire c'est remonter le pid du processus fautif au tout premier processus, même si c'est le Nième processus qui a généré l'erreur. Du coup, ce n'est pas forcément à son père qu'il le renvoi. Comprends tu mieux ?

Je pensais qu'il était possible de faire remonter un entier sans bidouiller ^^.

Merci pour ton idée en tout cas, je vais essayer, et je te tiens au courant ;).
0
Cedric477 Messages postés 6 Date d'inscription mercredi 18 novembre 2009 Statut Membre Dernière intervention 8 février 2012
1 févr. 2012 à 01:06
Bonjour CptPingu!

Bon alors j'ai reussi a repondre a ma question sans passer par ta méthode, et en utilisant un signal POSIX. En realité, j'utilise la fonction sigqueue() de POSIX, qui est un equivalent de la fonction kill(), sauf qu'elle prend en 3eme argument une union sigval dans laquelle on peut donner une valeur. Je vais poster un bout de code demain, car la je suis sur mon telephone.

En esperant que je puisse aider du monde, car peu d'exemples sont dispo pour sigqueue().
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
1 févr. 2012 à 15:00
Merci beaucoup d'avoir mis à jour ton topic avec la réponse.
C'est effectivement très pratique, et ça servira sûrement à quelqu'un d'autre.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
Rejoignez-nous