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 80 81 82 83 84 85 86
|
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/ipc.h>
4 #include <sys/shm.h>
5 #include <signal.h>
6
7 #define cle 100
8 #define TAILLE 1000
9
10 int mp_ID;
11 void *p; // pointeur sur mon segment de mémoire partagée
12 int info, pid;
13 int i, Nb_Elem;
14
15
16 void reveil();
17 void fin();
18
19
20 int main()
21 {
22 //printf("Bonjour!\n");
23
24 for (i=0;i<NSIG;i++)
25 signal(i,fin); // à a réception d'un tout autre signal que ceux spécifiés par la suite, la fonction fin est appelée.
26
27
28 if (mp_ID = shmget (cle, TAILLE, 0666|IPC_CREAT) == -1) // création d'un segment de mémoire partagée
29 {
30 perror("Erreur de création\n");
31 return(1);
32 }
33 (
34
35 if ((p=shmat(mp_ID,NULL,0)) == (void*)-1) // demande d'attachement du segment de mémoire partagée à une adresse laissée au soin du système d'exploitation
36 {
37 perror("Erreur d'attachement\n");
38 return(1);
39 }
40
41 int*(p); // je caste mon pointeur p sur un entier
42 signal (SIGUSR1,reveil); // à la réception de SIGUSR1 la fonction réveil est appelée (qui reprotègera contre le même signal)
43 Nb_Elem = TAILLE/sizeof(int); // Nombre d'éléments inscriptible dans la mémoire partagée
44
45
46 if ((pid = fork()) == 0) // Je suis Reception et j'écris dans la MP
47 {
48 for (i=0; i<Nb_Elem; i++)
49 {
50
51 p[i]=i*2;
52
53 printf("Je suis Reception, le fils, et j'ai écrit %d à la case %d de la mp\n", p[i],i);
54 kill(getppid(),SIGUSR1);
55 pause();
56 }
57 }
58
59 else // Je suis Decode et je lis dans la MP
60 {
61 for (i=0; i<Nb_Elem; i++)
62 {
63 pause();
64 printf("Je suis Decode, le père, et je lis %d à la case %d de la mémoire partagee\n",p[i],i);
65 kill(pid,SIGUSR1);
66 }
67 }
68 return(0);
69 }
70
71
72
73 void reveil()
74 {
75 signal(SIGUSR1,reveil); // protection contre le signal SIGUSR1
76 }
77
78
79 void fin()
80 {
81 shmdt((char*)p); // détachement de la mémoire partagée
82 shmctl(mp_ID,IPC_RMID,0); // destruction de la mémoire partagée
83 exit(1);
84 }
85 |
Partager