Bonjour

Mon problème :
Je ne sais pas si cygwin gère bien les clés de segment mémoire ?
Ou alors dois je mettre tout mon espace de travail d'eclipse dans /home de cygwin pour qu'il puisse gérer les clés ?

Je précise que le code fonctionne sous linux avec console ou sous eclipse en changeant évidemment les chemins des fichiers lecteur/redacteur!

Voici mon code en entier puis là où ça bloque une fois exécuté sous eclipse :
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
 
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
 
#define CLE 253
#define CLES 300
 
int main()
{
int shmid, semid, i;
char *mem=0;
int status, rc;
struct shmid_ds shmid_struct;
 
pid_t lecteur, redacteur;
 
shmid=shmget((key_t)CLE,1000,0750 |IPC_CREAT | IPC_EXCL);
 
mem=shmat(shmid,mem,0);
if(mem == (char*) -1) {
printf("\nShmat failed, erreur alloc memoire \n");
return(0);
}
 
*mem= 0;
*(mem+ 4) = 0;
 
semid= semget(CLES, 2, IPC_CREAT|IPC_EXCL|0600);
 
semctl(semid, 0, SETVAL, 1);
semctl(semid, 1, SETVAL, 1);
 
i = 0;
 for (i=0;i <3;i++) {
      lecteur= fork();
      if (lecteur== 0) {
         execl("C:\workspace\workspace_c\lecteur\Debug\lecteur.exe", "C:\workspace\workspace_c\lecteur\Debug\lecteur.exe", NULL);
      }
      else{
           redacteur= fork();
           if (redacteur== 0)
              execl("C:\workspace\workspace_c\redacteur\Debug\redacteur.exe", "C:\workspace\workspace_c\redacteur\Debug\redacteur.exe", NULL);
      }
  }
wait(&status);
 
    rc = shmctl(shmid, IPC_RMID, &shmid_struct);
    if (rc==-1)
      {
        printf("main: shmctl() failed\n");
        return -1;
      }
 
    rc = shmdt(mem);
    if (rc==-1)
      {
        printf("main: shmdt() failed\n");
        return -1;
      }
 
      rc = semctl( semid, 2, IPC_RMID );
    if (rc==-1)
      {
        printf("main: semctl() remove id failed\n");
        return -1;
      }
 
return 0;
 }
Je ne passe pas cette partie du code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
 
shmid=shmget((key_t)CLE,1000,0750 |IPC_CREAT | IPC_EXCL);
 
mem=shmat(shmid,mem,0);
if(mem == (char*) -1) {
printf("\nShmat failed, erreur alloc memoire \n");
return(0);
}
Merci à vous d'avance de vos remarques et conseils avisées