Faire remonter une valeur avec un signal [Résolu]

Cedric477 6 Messages postés mercredi 18 novembre 2009Date d'inscription 8 février 2012 Dernière intervention - 30 janv. 2012 à 15:55 - Dernière réponse : cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscription 6 octobre 2018 Dernière intervention
- 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!
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Cedric477 6 Messages postés mercredi 18 novembre 2009Date d'inscription 8 février 2012 Dernière intervention - 1 févr. 2012 à 14:44
3
Merci
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!

Merci Cedric477 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de Cedric477
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscription 6 octobre 2018 Dernière intervention - 30 janv. 2012 à 16:21
0
Merci
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
Commenter la réponse de cptpingu
Cedric477 6 Messages postés mercredi 18 novembre 2009Date d'inscription 8 février 2012 Dernière intervention - 30 janv. 2012 à 16:47
0
Merci
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 ;).
Commenter la réponse de Cedric477
Cedric477 6 Messages postés mercredi 18 novembre 2009Date d'inscription 8 février 2012 Dernière intervention - 1 févr. 2012 à 01:06
0
Merci
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().
Commenter la réponse de Cedric477
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscription 6 octobre 2018 Dernière intervention - 1 févr. 2012 à 15:00
0
Merci
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
Commenter la réponse de cptpingu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.