Synchronisation entre processus pères et fils
je trouve sur le net un code source(Synchronisation entre processus pères et fils) j'aimerai comprendre comment je peut exécuter ce programme sous unix
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| arnaud.c
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include<signal.h>
void erreur(char *mes);
char tab[10];
int main(void)
{
int pidb,pidc,p1;
int bip=0;
char car[10];
// creation du pipe
unlink("pipe");
mkfifo("pipe",0777);
// creation des 2 fils
pidb=fork();
if (pidb==0) execv("bob",NULL);
pidc=fork();
if (pidc==0) execv("charly",NULL);
//ouverture d'un pipe en ecriture
p1=open("pipe",O_WRONLY);
if (p1==-1) erreur("pb d'ouverture en ecriture");
printf("\ntaper une sequences de caracteres\n");
scanf("%s",car);
// lecture des caracteres
int i=0;
while(car[i]!='\0') // pas de &car[i]
{
// tri+envoi d'un signal au fils approprié
usleep(500);
if (car[i]>='A' && car[i]<='z')
kill(pidb,SIGUSR1);
else if (car[i]>='1' && car[i]<='9')
kill(pidc,SIGUSR1);
else
{
printf("caractere non valide\n");
bip=1; // on n'ecrit rien dans le pipe
}
// écriture dans le pipe
if (bip==0) write(p1,&car[i],sizeof(car));
i++;
}
// on envoie le message de fin de l'ecriture qui est "!"
char fin;
fin='!';
write(p1,&fin,sizeof(car));
//on referme le pipe en écriture
usleep(500);
close(p1);
// on ouvre le pipe en lecture
p1=open("pipe",O_RDONLY);
if (p1==-1) erreur("pb d'ouverture en lecture");
//on lit
int j;
for(j=0;j=10;j++)
{
read(p1,&tab[j],sizeof(tab));
printf("%s",&tab[j]);
}
//on referme le pipe en lecture
usleep(500);
close(p1);
// on tue les processus
kill(pidb,SIGKILL);
kill(pidc,SIGKILL);
return(0);
}
void erreur(char *mes)
{
printf("%s\n",mes);
exit(-1);
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| bob.c
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include<signal.h>
void erreur(char *mes);
void lect(int sig);
void envoyer();
// s'occupe des lettres
int p1;
int i=0;
char tab[10][10];
int main(void)
{
//ouverture d'un pipe en lecture
p1=open("pipe",O_RDONLY);
if (p1==-1) erreur("pb d'ouverture en lecture\n");
// on se prepare au signal
signal(SIGUSR1,lect);
// on verifie si le signal de fin a ete envoyé
char fin;
fin='!';
if (strcmp(&tab[10][i],&fin)==0)
envoyer();
// on attend le signal
for(;;)
{
pause();
}
}
void lect(int sig)
{
char lett;
// lecture du pipe
read(p1,&lett,sizeof(lett));
//on stocke la variable ds un tableau
tab[10][i]=lett;
i++;
// on affiche le resultat
printf("la lettre lue est %c\n", lett);
//on referme le pipe
close(p1);
}
void envoyer()
{
//on ouvre le pipe en éccriture cette fois ci
p1=open("pipe",O_WRONLY);
write(p1,tab,sizeof(tab));
close(p1);
}
void erreur(char *mes)
{
printf("%s\n",mes);
exit(-1);
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| charly.c
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include<signal.h>
void erreur(char *mes);
void lect(int sig);
void envoyer();
// s'occupe des chiffres
int p1;
int i=0;
char tab[10][10];
int main(void)
{
//ouverture d'un pipe en lecture
p1=open("pipe",O_RDONLY);
if (p1==-1) erreur("pb d'ouverture en lecture\n");
// on se prepare au signal
signal(SIGUSR1,lect);
// on verifie si le signal de fin a ete envoyé
char fin;
fin='!';
if (strcmp(&tab[10][i],&fin)==0)
envoyer();
// on attend le signal
for(;;)
{
pause();
}
}
void lect(int sig)
{
char chiff;
// lecture du pipe
read(p1,&chiff,sizeof(chiff));
//on stocke la variable ds un tableau
tab[10][i]=chiff;
i++;
// on affiche le resultat
//printf("la lettre lue est %c\n", lett);
//on referme le pipe
close(p1);
}
void envoyer()
{
//on ouvre le pipe en éccriture cette fois ci
p1=open("pipe",O_WRONLY);
write(p1,tab,sizeof(tab));
close(p1);
}
void erreur(char *mes)
{
printf("%s\n",mes);
exit(-1);
} |
et merci en avance