Cedric477
Messages postés6Date d'inscriptionmercredi 18 novembre 2009StatutMembreDernière intervention 8 février 2012
-
30 janv. 2012 à 15:55
cptpingu
Messages postés3836Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention11 février 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!
A voir également:
La valeur n'est pas comprise dans la plage attendue
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() */
}
cptpingu
Messages postés3836Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention11 février 2023124 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/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Cedric477
Messages postés6Date d'inscriptionmercredi 18 novembre 2009StatutMembreDerniè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 ;).
Cedric477
Messages postés6Date d'inscriptionmercredi 18 novembre 2009StatutMembreDerniè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().
Vous n’avez pas trouvé la réponse que vous recherchez ?
cptpingu
Messages postés3836Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention11 février 2023124 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/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question