compte.c
:
#include <stdio.h>
#include "ipcTools.h"
#define ITER 1000
int accedeMemp(key_t cle,int nb){
return shmget(cle,nb,0600);
}
void * attacheMemp(int shmid){
return shmat(shmid,0,0);
}
int main(void) {
key_t key;
int * shared,locale;
int i,shmid;
key=ftok("/dc/password",0);
shmid=accedeMemp(key,sizeof(int));
if (shmid==-1) {
perror("acces shm");
exit(1);
}
/* attachement shm */
shared=(int*) attacheMemp(shmid);
if (shared==((int *)-1)) {
perror("attachement memoire echec");
exit(1);
} for(i=0;i<ITER;i++){
locale=*shared;
printf("fils %d : valeur = %d\n",getpid(),locale);
locale++;
*shared=locale;
printf("fils %d : valeur = %d\n",getpid(),locale);
}
return 0;
}
EX3.c:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
#define NBPROCS 10
int creerMemp(key_t cle,int nb);
int accedeMemp(key_t cle,int nb);
void * attacheMemp(int shmid);
int detruitMemp(int shmid);
void * shmalloc(key_t cle,int size);
int shmfree(key_t cle);
int creerMemp(key_t cle,int nb){
return shmget(cle,nb,IPC_CREAT|IPC_EXCL|0600);
}
int accedeMemp(key_t cle,int nb){
return shmget(cle,nb,0600);
}
void * attacheMemp(int shmid){
return shmat(shmid,0,0);
}
int detruitMemp(int shmid){
return shmctl(shmid,IPC_RMID,0);
}
void * shmalloc(key_t cle,int size){
void * res;
int id=creerMemp(cle,size);
if (id==-1)
return 0;
res=attacheMemp(id);
if (res==(void*)-1) {
detruitMemp(id);
return 0;
}
return res;
}
int shmfree(key_t cle){
return detruitMemp(shmget(cle,1,0));
}
int main(void){
/* EX3 */
key_t key;
int * N;
void * res;
pid_t pid;
int i;
key=ftok("/dc/password",0);
N=(int *) shmalloc(key,sizeof(int)); /* error
*/
if (!N){
printf("shmalloc ehec\n");
exit(1);
}
*N=15;
printf("Bonjour : %d\n",*N);
for(i=0;i<NBPROCS;i++){
switch(pid=fork()) {
case -1: perror("erreur fork");
exit(2);
case 0:
// printf("fils %d",i);
execlp("./compte","compte",0);
// puts("Fin fils %d",i);
exit(0); // facultatif
default:
/* PERE */
}
}
/* On attend TOUS les fils */
for(i=0;i<NBPROCS;i++)
wait(0);
/* tous les fils sont termines */
/* affichage du resultat final*/
printf("Resultat final : %d",*N);
shmfree(key);
return 0;
}
/* ©2003
All Rights Reserved to www.Software-DS.com
*/
|