Bonjour à tous,

Je cherche à faire basiquement communiquer deux processus par une mémoire partagée. Le problème se situe lorsque je fais la demande d'attacher ma mémoire partagée à mon processus. (je dis mon car l'un des procesus est le fils de l'autre ultérieurement). Le message d'erreur est le suivant:

Identifier removed:
L'erreur se situe à la ligne 35!


J'ai beau caster mes pointeurs sur tout et n'importe quoi, pas moyen.
(J'essaie en effet de récupérer l'adresse mémoire dans une variable de type pointeur)
Pouvez-vous m'aider?

Merci d'avance!

Voici le code:

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
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