Bonjour à tous,
Pour un exercice, je dois transférer une chaine de caractères d'un client vers un serveur, ce dernier transforme les minuscules en majuscule et la renvoie au client, tout ça en utilisant des sémaphores et une mémoire partagée.
A mon avis, ce qui coince, c'est que je n'utilise pas les sémaphores au bon moment. Les fonctions down, up et initialize sont correctes car je les ai déjà utilisées dans un exercice précédent.
Si vous pouviez jeter un coup d'oeil, ce serait sympa.
Client :
Serveur :
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 # include <stdio.h> # include <stdlib.h> # include <unistd.h> # include <sys/wait.h> # include <sys/types.h> # include <signal.h> # include <sys/time.h> # include <sys/sem.h> # include <sys/types.h> # include <sys/ipc.h> # include <semaphore.h> # include <sys/shm.h> int down(int sem_id, int sem_num) { struct sembuf sem_op; sem_op.sem_num=sem_num; sem_op.sem_op=-1; sem_op.sem_flg=0; if(semop(sem_id, &sem_op, 1) == -1) return -1; else return 0; } int up(int sem_id, int sem_num) { struct sembuf sem_op; sem_op.sem_num=sem_num; sem_op.sem_op=+1; sem_op.sem_flg=0; if(semop(sem_id, &sem_op,1) == -1) return -1; } int main (){ int i=0, semid, shmid; char *string; semid=semget(1234,1,IPC_CREAT|0660); if(semid==-1) { perror("Erreur lors du semget"); exit(-1); } shmid=shmget(13245,80*sizeof(char),IPC_CREAT|0660); // Creation de la memoire partagee if(shmid==-1) { perror("Erreur lors du shmget"); exit(-1); } string=(char*)shmat(shmid,NULL,SHM_W|SHM_R); // Attachement de la memoire partagee dans le pointeur memoire down(semid,0); scanf("%s", string); printf("%s \n", string); up(semid,0); return 0 ; }
Comme vous l'avez remarqué, je ne me suis pas encore soucié du retour du message. Merci de votre aide.
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103 # include <stdio.h> # include <stdlib.h> # include <unistd.h> # include <sys/wait.h> # include <sys/types.h> # include <signal.h> # include <sys/time.h> # include <sys/sem.h> # include <sys/types.h> # include <sys/ipc.h> # include <semaphore.h> # include <sys/shm.h> union semun { int val; struct semid_ds *buf; unsigned short *array; struct seminfo *__buf; }; int initialize(int sem_id, int sem_num, int init) { union semun semunion; semunion.val=init; if(semctl(sem_id,sem_num,SETVAL,semunion) == -1) return -1; else return 0; } int down(int sem_id, int sem_num) { struct sembuf sem_op; sem_op.sem_num=sem_num; sem_op.sem_op=-1; sem_op.sem_flg=0; if(semop(sem_id, &sem_op, 1) == -1) return -1; else return 0; } int up(int sem_id, int sem_num) { struct sembuf sem_op; sem_op.sem_num=sem_num; sem_op.sem_op=+1; sem_op.sem_flg=0; if(semop(sem_id, &sem_op,1) == -1) return -1; } int main (){ int i=0, semid, shmid; char *string; semid=semget(1234,1,IPC_CREAT|0660); // Creation d'un groupe contenant 2 semaphore if(semid==-1) { perror("Erreur lors du semget"); exit(-1); } initialize(semid,1,0); shmid=shmget(13245,80*sizeof(char),IPC_CREAT | 0660); // Creation de la memoire partagee if(shmid==-1) { perror("Erreur lors du shmget"); exit(-1); } string=(char*)shmat(shmid,NULL,SHM_W|SHM_R); // Attachement de la memoire partagee dans le pointeur memoire while(1){ printf("serveur %s \n", string); // 2 lignes de test sleep(3); //down(semid,0); // Vrai code /*for (i=0; i<sizeof(string); i++) string[i]=toupper(string[i]); for (i=0; i<sizeof(string); i++) printf("%c", string[i]); printf("\n"); //up(semid,0); */ } shmdt(string); // Detachement de la memoire partagee shmctl(shmid,IPC_RMID,NULL); // Suppression de la memoire partagee semctl(semid,0,IPC_RMID,NULL); // Suppression du groupe de semaphores return 0 ; }
Partager