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 :
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 ;
 
}
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
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 ;
 
}
Comme vous l'avez remarqué, je ne me suis pas encore soucié du retour du message. Merci de votre aide.