bonjour, j'essaie de mettre en place un petit code qui permet a un script "ecrivain" d'écrire un message dans un segment de mémoire, qui attend qu'un script "lecteur" vienne lire le message et permette alors a l'écrivain de se fermer. Ceci est géré a l'aide de 2 sémaphores.
J'exécute le code ecrivain (apres une compilation avec cc en sh) en tâche de fond. Puis je lance le lecteur.
L'écrivain écrit bien dans le segment, le lecteur lis bien le segment et s'exécute bien jusqu'au bout mais ne redonne pas la main a l'écrivain qui ne se termine pas. J'aimerai un conseil, je pense que le probleme se situe au niveau du pointage sur le sémaphore qui permet la mise en attente mais je n'arrive pas a le cerner.
D'avance merci.
Voici les 2 scripts.
ecrivain :
Code c : 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 #include <sys/ipc.h> #include <sys/shm.h> #include <sys/sem.h> #include <stdio.h> #include <stdlib.h> #define CLEF 665 #define LONGUEUR_SEGMENT 512 int main (int argc, char *argv[]) { int semaphores; int memoirePartagee; struct sembuf manipSemaphores[2]; char *attacheMoi; if ((memoirePartagee=shmget (CLEF, LONGUEUR_SEGMENT, IPC_CREAT|0666)) == -1) { puts("impossible de creer le segment de memoire partagee"); exit (1); } if ((semaphores=semget(CLEF,2,IPC_CREAT|0666)) == -1) { puts("impossible de créer les sempahores"); exit(1); } /* les deux semaphores sont initialisées en meme temps */ manipSemaphores[0].sem_num=0; manipSemaphores[0].sem_op=1; manipSemaphores[1].sem_num=1; manipSemaphores[1].sem_op=1; semop(semaphores, manipSemaphores,2); /*Operation P(1) sur le 1er semaphore => prise de ressource sur la memoire partagée */ manipSemaphores[0].sem_num=0; manipSemaphores[0].sem_op=-1; semop(semaphores,manipSemaphores, 1); puts("je prends de la ressource");fflush(stdout); /* attachement du segment a une adresse choisie par le système */ attacheMoi=shmat(memoirePartagee,NULL, 0); if ((int)(attacheMoi)==-1) { puts("impossible d'attacher le segment !"); exit(1); } else { printf("Adresse de l'attachement : %p \n",attacheMoi); strcpy(attacheMoi, "Message a l'adresse de l'autre processus !"); shmdt(attacheMoi); /* Operation V(1) sur le premier semaphore => liberation de la ressource de memoire partagee */ manipSemaphores[0].sem_num=0; manipSemaphores[0].sem_op=1; semop(semaphores, manipSemaphores,1); } puts("Attente de l'autre processus ");fflush(stdout); /* arret de l'écrivain ICI, il ne repart pas */ /* Operation Z sur le second semaphore */ manipSemaphores[0].sem_num=1; manipSemaphores[0].sem_op=0; semop(semaphores, manipSemaphores,1); puts ("Debloque !"); fflush(stdout); /*Suppression des IPCs */ semctl(semaphores,0,IPC_RMID); shmctl(memoirePartagee,IPC_RMID,0); return 0;
lecteur:
Code c : 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 #include <sys/ipc.h> #include <sys/shm.h> #include <sys/sem.h> #include <stdio.h> #include <stdlib.h> /*processus lecteur */ #define CLEF 665 #define LONGUEUR_SEGMENT 512 int main(int argc, char *argv[]) { int semaphores; int memoirePartagee; struct sembuf manipSemaphores; char *attacheMoi; if ((memoirePartagee=shmget(CLEF,LONGUEUR_SEGMENT,0600)) == -1) { puts ("Impossible d'acceder au segment de memoire partagée"); exit(1); } if (( semaphores=semget(CLEF,2,0600)) == -1) { puts ("Impossible d'acceder aux semaphores "); exit(1); } /* Operation P(1) => on demande à accéder a la ressource */ manipSemaphores.sem_num=0; manipSemaphores.sem_op=-1; semop(semaphores, &manipSemaphores,1); puts("Je demande a acceder a la ressource ");fflush(stdout); attacheMoi=shmat(memoirePartagee,NULL,0); /*attachement de memoire partagee)*/ if ((int)(attacheMoi)==-1) { puts ("impossible d'attacher !"); exit(1); } else { printf("Adresse de l'attachement: %p \n",attacheMoi); puts("Contenu de la memoire a l'attachement"); puts(attacheMoi); shmdt(attacheMoi); manipSemaphores.sem_num=0; manipSemaphores.sem_op=1; semop(semaphores,&manipSemaphores,1); } puts("Deblocage de l'autre processus "); fflush(stdout); /* Debloquer le semaphore en attente se fait a l'aide d'une operation prise de ressource P(1) car la v aleur courante de celui-ci est de 1*/ manipSemaphores.sem_num=1; manipSemaphores.sem_op=-1; semop(semaphores,&manipSemaphores,1); puts("fin de traitement de lecteur"); fflush(stdout); return 0; }
Partager