J'ai écrit un programme qui effectue la communication entre 3 processus via des segments de memoire partagee.
Le code marche, mais 1 seule fois...apres il ne marche plus.
Je pense que le probleme vient du segment mémoire, car si je change la clef du segment, le programme remarche...mais 1 seule fois.
il y a 3 programmes: le 1er saisit un nombre en binaire et l'ecrit dans le segment.
Le 2nd le convertit en decimal.
Le 3ieme le convertit en hexa.
Le 1er programme affiche le nombre dans les 3 formats.
Il y a une boucle pour faire l'opératon plusieurs fois.
La 1ere fois que je l'exécute, ca marche (mais le programme se ferme pas a la fin...)
Quand je l'exécute une 2nde fois, sans rien changer, il ne marche plus, seul le 1er programme affiche ce qu'il faut.
Si vous pouviez me dire quoi faire...
Prog1
typedef struct
{
int nb;
char bin[16];
char hex[16];
}SEGMENT;
void erreur(char *mes);
void lire(int sig);
SEGMENT *pSeg;
int shmid ;
int main(void)
{
int cle,pidB,pidC;
char *argv[3];
char chpidC[10];
char bin[10];
cle=ftok("fic",'1');
shmid=shmget(cle,sizeof(SEGMENT),IPC_CREAT|0666);
if(shmid==-1) erreur("pb creation de segment\n");
pSeg=(SEGMENT *)shmat(shmid,NULL,0);
//creation du fils C
pidC=fork();
if (pidC==0)
execv("C9",NULL);
//creation du fils B
pidB=fork();
argv[0]="B9";
sprintf(chpidC,"%d",pidC);
argv[1]=chpidC;
argv[2]=NULL;
if (pidB==0)
execv("B9",argv);
do
{
//saisie du nombre binaire
printf("taper le nombre en binaire\n");
scanf("%s",pSeg->bin);
printf("le nombre binaire dans A est %s\n",pSeg->bin);
kill(pidB,SIGUSR1);
signal(SIGUSR2,lire);
pause();
}while(pSeg->nb!=0);
shmdt(pSeg);
shmctl(shmid,IPC_RMID,NULL);
exit(0);
}
void lire(int sig)
{
printf("decimal =%d\n",pSeg->nb);
printf("hexa =%s\n",pSeg->hex);
printf("binaire =%s\n",pSeg->bin);
}
------------
Prog2
typedef struct
{
int nb;
char bin[16];
char hex[16];
}SEGMENT;
void erreur(char *mes);
void lireEcrire(int sig);
int puis2(int e);
int traduire(char *bin);
SEGMENT *pSeg;
int pidC,shmid;
int main(int argc, char *argv[])
{
int cle;
pidC = atoi(argv[1]);
cle=ftok("fic",'1');
shmid=shmget(cle,sizeof(SEGMENT),SHM_RDONLY);
if(shmid==-1) erreur("pb ouv de segment\n");
pSeg=(SEGMENT *)shmat(shmid,NULL,0);
signal(SIGUSR1,lireEcrire);
for(;;)
pause();
exit(0);
}
void lireEcrire(int sig)
{
if(pSeg->nb!=0)
{
pSeg->nb=traduire(pSeg->bin);
printf("le nombre decimal dans B est %d\n",pSeg->nb);
//on dit a C de lire
kill(pidC,SIGUSR1);
}
else
{
shmdt(pSeg);
shmctl(shmid,IPC_RMID,NULL);
exit(0);
}
}
------------
Prog3
typedef struct
{
int nb;
char bin[16];
char hex[16];
}SEGMENT;
void erreur(char *mes);
void lireEcrire(int sig);
SEGMENT *pSeg;
int pidC,shmid;
int main(void)
{
int cle;
cle=ftok("fic",'1');
shmid=shmget(cle,sizeof(SEGMENT),SHM_RDONLY);
if(shmid==-1) erreur("pb ouv de segment\n");
pSeg=(SEGMENT *)shmat(shmid,NULL,0);
signal(SIGUSR1,lireEcrire);
for(;;)
pause();
exit(0);
}
void lireEcrire(int sig)
{
if(pSeg->nb!=0)
{
//traduction du decimal en hexa
sprintf(pSeg->hex,"%x",pSeg->nb);
printf("le nombre hexa dans C est %s\n",pSeg->hex);
//on envoie un signal a A pour lui dire de lire
kill(getppid(),SIGUSR2);
}
else
{
shmdt(pSeg);
shmctl(shmid,IPC_RMID,NULL);
exit(0);
}
}
Merci d'avance
