Communication par file de message

Résolu
cs_adri85 Messages postés 18 Date d'inscription jeudi 22 février 2007 Statut Membre Dernière intervention 21 septembre 2009 - 3 mars 2007 à 00:13
cs_adri85 Messages postés 18 Date d'inscription jeudi 22 février 2007 Statut Membre Dernière intervention 21 septembre 2009 - 5 mars 2007 à 17:40
Bonjour,

Je débute la programmation sous unix et je souhaite développer une petite application.
eLe programme père demande à l'utilisateur dans un dialogue (j'utilise printf et scanf) de poser des calculs simples (+ - * / %) avec 2 nombres entiers. J'utilise une file de message pour que le père envoie ces données au fils. Le fils est averti par un signal. Celui ci lit les données, fait le calcul, renvoie le résultat au père et lla prévient par un signal que le calcul est fait. Le père affiche ensuite le résultat et demande à l'utilisateur un nouveau calcul.

Voici mon code actuel incomplet

#include

<string.h>
#include

<stdlib.h>
#include

<stdio.h>
#include

<ctype.h>
#include

#include

<sys/types.h>
#include

<sys/ipc.h>
#include

<sys/msg.h>
#include

<sys/wait.h>#include

<sys/time.h>#define

CLEF_REQUETES 0x00012345
#define

LG_MAX 512
struct

msgform {

long mtype;
//type de message

char mtext[ LG_MAX ];
//corps du message}

msg;

int res;

int frequete;
void

ouvrier(){

//on r‚cupŠre les infos de la file de messageres = msgsnd(frequete, & msg, strlen(msg.mtext) + 1, 0);

if (res == -1) { perror(
"msgsnd"); exit(0); } ...

}

int

main(
int argc,
char *argv[]){

int fils;

char nombre1;

char nombre2;

char operation;

struct sigaction environ;

struct sigaction environ2;sigset_t masque;

sigset_t masque2;

sigemptyset(&masque);

sigemptyset(&masque2);

sigaddset(&masque,SIGUSR1);

sigaddset(&masque2,SIGUSR2);

environ.sa_handler = Afficher;

environ.sa_mask = masque;

environ2.sa_handler = ouvrier;

environ2.sa_mask = masque2;

sigaction(SIGUSR1,&environ,NULL);

//On cr‚e une file de messagefrequete = msgget(CLEF_REQUETES, 0700 | IPC_CREAT);

if (frequete == -1) { perror(
"msgget");
return (EXIT_FAILURE);} msg.mtype = getpid();

//on demande … l'utilisateur l'op‚ration … effectuer

while (1){printf(

"entrez nombre1");scanf(nombre1,

"%s");printf(

"entrez nombre2");scanf(nombre2,

"%s");printf(

"op‚ration : +,-,*,/ ?");scanf(operation,

"%c");

//on r‚cupŠre le textestrcpy(msg.mtext, nombre1);

strcat(msg.mtext, nombre2);

strcat(msg.mtext, operation);

//On cr‚‚ le filsfils = fork();

if (fils < 0) { printf(
"erreur au fork");
return (EXIT_FAILURE);}

//Si on est dans le pŠre

if (fils > 0){

//On envoie le message sur la file de messageres = msgsnd(frequete, & msg, strlen(msg.mtext) + 1, 0);

if (res == -1) { perror(
"msgsnd");
return (EXIT_FAILURE);}

//On envoie un signal au fils kill(fils, SIGUSR2);

}

//Si on est dans le fil

if ( fils == 0){

sigaction(SIGUSR2,&environ2,NULL);

}

//On affiche le message traduitprintf(

"result : %s\n", msg.mtext);

return (EXIT_SUCCESS); }

}

mon problème est de récupérer les infos contenu dans msg.mtext quand je suis dans le fils (nombre1, nombre2 et operation) afin de faire le calcul.

merci de m'aider et de me dire si vous trouvez des "bugs"

2 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
5 mars 2007 à 15:48
Salut,


Je me suis fais avoir comme toi après un copier-coller depuis gedit.
Par contre nedit ne m'a jamais poser de problème à ce niveau. Un jour,
faudrat qu'on m'explique pourquoi Windows utilise 2 caractères pour
sinifier la fin de ligne.


Concernant ton problème...


Dans ton while, tu lis les données puis tu crées un fils... Donc le
fils à directement accès au données (fork() fait une copie de tout
:pile, tât, code et registres) via msg.mtext.


Je crois que si tu veux faire ton algo (Compliqué pour rien), il faut
que tu crée le fils avant la lecture des données. Tu peux ensuite
utiliser un pipe pour échanger les données entre tes deux processus.
Un source qui devrait t'aider.
3
cs_adri85 Messages postés 18 Date d'inscription jeudi 22 février 2007 Statut Membre Dernière intervention 21 septembre 2009
5 mars 2007 à 17:40
thank you
Adri85
0
Rejoignez-nous