besoin d'aide pour mémoire partagée en c

Voila, pour mes TP d'informatique temps réel, j'ai besoin d'utiliser la mémoire partagée pour communiquer entre 2 processus.

Un processus envoie une phrase en minuscule au 2ème, qui lui la transforme en majuscule et la renvoie au premier.

J'ai compris la déclaration de la mémoire partagée dans les 2 processus.

La ou je bloque, c'est qu'il faut attacher la mémoire au processus.. ( pourquoi et comment ? )
avec un truc du genre :
PHP:
int *writers;
writers = (int *) shmat(.....);
A quoi ça sert ?

Ensuite, avec la cmd SPC_STAT dans la fonction shmctl, je peux écrire dans ma mémoire partagée, mais comment lire ce que j'ai écrit avec mon 2ème processus ?

merci de vos lanternes :)
 
process srv

PHP:
#include <stdio.h>
#include <stdlib.h>
//#include <signal.h>
//#include <unistd.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h>




union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};

int down(int semid, int semnum)
{
	struct sembuf sem;
	sem.sem_num=semnum;
	sem.sem_op=-1;
	sem.sem_flg=0;
	return semop(semid,&sem,1);	
}

int up(int semid, int semnum)

{
	struct sembuf sem;
	sem.sem_num=semnum;
	sem.sem_op=+1;
	sem.sem_flg=0;
	return semop(semid,&sem,1);
}

int init(int semid, int semnum, int val)
{
	union semun sem_union;
	sem_union.val=val;
	return semctl(semid,semnum,SETVAL,sem_union);
}	

int main()

{
	int i,semid, shmid;
	semid=semget(1337,2,IPC_CREAT|0660);
	init(semid,0,0);
	init(semid,1,0);
	shmid=shmget(1336,sizeof(char[81]),IPC_CREAT|0660);
	char *writer;
	writer = (char *) shmat(shmid,NULL,SHM_R|SHM_W);
	down(semid,0);
	
	for(i=0;i<81;i++)
		writer[i]=toupper(writer[i]);
	
	up(semid,1);
	
	
	shmdt(writer);
	
	
	
	
	semctl(semid,0,IPC_RMID,NULL);
	semctl(semid,1,IPC_RMID,NULL);
	semctl(shmid,0,IPC_RMID,NULL);
	
	
	


	return 0;
	
	
}
process client

PHP:
#include <stdio.h>
#include <stdlib.h>
//#include <signal.h>
//#include <unistd.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h>




union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};

int down(int semid, int semnum)
{
	struct sembuf sem;
	sem.sem_num=semnum;
	sem.sem_op=-1;
	sem.sem_flg=0;
	return semop(semid,&sem,1);	
}

int up(int semid, int semnum)

{
	struct sembuf sem;
	sem.sem_num=semnum;
	sem.sem_op=+1;
	sem.sem_flg=0;
	return semop(semid,&sem,1);
}

int init(int semid, int semnum, int val)
{
	union semun sem_union;
	sem_union.val=val;
	return semctl(semid,semnum,SETVAL,sem_union);
}	

int main()

{
	int i,semid, shmid;
	semid=semget(1337,2,0660);
	shmid=shmget(1336,sizeof(char[81]),IPC_CREAT|0660);
	char *writer;
	writer = (char *) shmat(shmid,NULL,SHM_R|SHM_W);
	
	scanf("%s", writer);
	
	up(semid,0);
	
	down(semid,1);
	
	printf("result : %s\n",writer);
	
	
	shmdt(writer);
	


	return 0;
	
	
}
 
1er
OP
DeflaMental

DeflaMental

[-_-]
yeah merci, je commence à comprendre :)

y a 2-3 trucs que je n'ai pas encore compris mais le man devrait suffire :)

PS : merci aussi d'avoir fait exactement ce que mon TP demandait sans même avoir donné toutes ces précisions :D
 
yeah merci, je commence à comprendre :)

y a 2-3 trucs que je n'ai pas encore compris mais le man devrait suffire :)

PS : merci aussi d'avoir fait exactement ce que mon TP demandait sans même avoir donné toutes ces précisions :D
j'les ai fait avant toi :gne:
 
1er
OP
DeflaMental

DeflaMental

[-_-]
je me disais bien :)

sinon j'ai un problème avec mon serveur (j'ai testé mon client avec ton serveur, ça fonctionne.. ).

Le serveur se termine tout de suite ( pourtant j'ai bien décrémenté le sémaphore )

PHP:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>

int main(){
int i;
int shmid;
int semid;
char *writer;


// ------------------------------- sémaphore -------------------------------------------------

semid=semget(1337, 2,0660); // création de 2 semaphores 

semctl (semid, 0, SETVAL, 0); // initialisation du premier sem à 0
semctl (semid, 1, SETVAL, 0); // initialisation du deuxième sem à 0


struct sembuf up1;
up1.sem_num = 0; // premier
up1.sem_op = 1; //monte
up1.sem_flg = 0; 

struct sembuf down1;
down1.sem_num = 0; //premier
down1.sem_op = -1; //décrémente
down1.sem_flg = 0; 

struct sembuf up2;
up2.sem_num = 1; //deuxième
up2.sem_op = 1; //monte
up2.sem_flg = 0; 

struct sembuf down2;
down2.sem_num = 1; //deuxième
down2.sem_op = -1; //décrémente
down2.sem_flg = 0; 
// ------------------------------- sémaphore

shmid =shmget(1336,80*sizeof(char),IPC_CREAT|0660);


writer = (char *) shmat(shmid,NULL, SHM_R|SHM_W);

semop(semid, &down1, 1);

for(i=0;i<80;i++){
        writer[i]=toupper(writer[i]); 
        }

semop(semid, &up2, 1);

shmdt(writer);


semctl(semid,0,IPC_RMID,NULL);
semctl(semid,1,IPC_RMID,NULL);
semctl(shmid,0,IPC_RMID,NULL); 

// printf("test");
return 0;

}

peut-être ça viendrais de ça :

semctl (semid, 0, SETVAL, 0);
que j'ai mis à la place de

union semun sem_union;
sem_union.val=0;
semctl (semid, 0, SETVAL, 0);
car çà me renvoyait cette erreur :

exo1.c: In function ‘main’:
exo1.c:15: error: storage size of ‘sem_union’ isn’t known
;
Je l'avais recopié tel quel dans le protocole, je dois demander pourquoi...

Je suppose que pour les files de message c'est pareil ? je n'ai même pas d'exemple pour ça.
 
1er
OP
DeflaMental

DeflaMental

[-_-]
bon j'ai trouvé mon erreur :

writer = (char *) shmat(shmid,NULL, SHM_R|SHM_W);

!=

writer = (char *)shmat(shmid,NULL, SHM_R|SHM_W);

oui l'espace entre )et shmat n'introduit pas d'erreur mais fait quand même terminer le programme... -_-"
 
Haut