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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager