begin process at 2012 05 29 05:53:22
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Divers

 > 

Faire remonter une valeur avec un signal


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Faire remonter une valeur avec un signal

lundi 30 janvier 2012 à 15:55:12 | Faire remonter une valeur avec un signal

Cedric477

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!
lundi 30 janvier 2012 à 16:21:10 | Re : Faire remonter une valeur avec un signal

CptPingu

Administrateur CodeS-SourceS
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
Merci d'utiliser Réponse acceptée si un post répond à votre question
lundi 30 janvier 2012 à 16:47:15 | Re : Faire remonter une valeur avec un signal

Cedric477

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 ;).
mercredi 1 février 2012 à 01:06:45 | Re : Faire remonter une valeur avec un signal

Cedric477

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().
mercredi 1 février 2012 à 14:44:47 | Re : Faire remonter une valeur avec un signal

Cedric477

Réponse acceptée !
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!
mercredi 1 février 2012 à 15:00:05 | Re : Faire remonter une valeur avec un signal

CptPingu

Administrateur CodeS-SourceS
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
Merci d'utiliser Réponse acceptée si un post répond à votre question


Cette discussion est classée dans : valeur, fils, signal, père, remonter


Répondre à ce message

Sujets en rapport avec ce message

fork(), kill() et wait() ... [ par LocalStone ] Salut à tous, Alors voilà, je suis face à un problème qui me prend la tête depuis au moins une heure, mais je ne trouve vraiment pas de solution ni d comment envoyer un signal du pere au fils pour faire un traitement [ par facilus ] Bonjour,je voudrai faire un programme qui crée un processus fils qui affiche un message quand il reçoit lesignal SIGUSR1 du processus père.merci les pipes [ par maciass ] slt svp est ce que qlq un peut m expliquer comment créer  un pipe(tube) pour faire communiquer deux processus père et fils (le père envoie une chaine les tubes et les fork() [ par maciass ] slt svp est ce que qlq un peut m expliquer comment créer  un pipe(tube) pour faire communiquer deux processus père et fils (le père envoie une chaine need help [ par nlepe ] Le problème est le suivant : On cherche a faire un serveur de calcul qui effectue deux opérations l'addition et la multiplication mais en utilisant le Fork langage C [ par lozxxx ] Bonjour, je suis débutant en programmation j aimerais savoir comment créer un programme père qui crée 2 fils, chaque fils crée deux fils, chaque proce Pb variable snmp c++ [ par atum251 ] Pb variable snmp c++ -------------------------------------------------------------------------------- Bonjour, j'éssai d'intérroger un switch avec récuperation d une valeur en C [ par manoulatou ] je veux savoir comment recuperer une valeur saisie par le clavier? problem dans un code sudoko en c [ par sassi1985 ] svp jai un mini projet c sur le code de jeux sodoku je fait le code mais j ai problème de la fichage il affiche des grand entier aléatoire voila mon Structure de données en C [ par samox007 ] Bonjour,je suis débutant en programmation et je veux votre aide . Mon soucis et le suivant ;je veux alimenter une arbre de façon que l'utilisateur la


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,671 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales