diff --git a/ANALE-1/EXO1/Makefile b/ANALE-1/EXO1/RESOLUTION/Makefile similarity index 100% rename from ANALE-1/EXO1/Makefile rename to ANALE-1/EXO1/RESOLUTION/Makefile diff --git a/ANALE-1/EXO1/commun.h b/ANALE-1/EXO1/RESOLUTION/commun.h similarity index 100% rename from ANALE-1/EXO1/commun.h rename to ANALE-1/EXO1/RESOLUTION/commun.h diff --git a/ANALE-1/EXO1/conso.c b/ANALE-1/EXO1/RESOLUTION/conso.c similarity index 100% rename from ANALE-1/EXO1/conso.c rename to ANALE-1/EXO1/RESOLUTION/conso.c diff --git a/ANALE-1/EXO1/dijkstra.c b/ANALE-1/EXO1/RESOLUTION/dijkstra.c similarity index 100% rename from ANALE-1/EXO1/dijkstra.c rename to ANALE-1/EXO1/RESOLUTION/dijkstra.c diff --git a/ANALE-1/EXO1/dijkstra.h b/ANALE-1/EXO1/RESOLUTION/dijkstra.h similarity index 100% rename from ANALE-1/EXO1/dijkstra.h rename to ANALE-1/EXO1/RESOLUTION/dijkstra.h diff --git a/ANALE-1/EXO1/launcher.c b/ANALE-1/EXO1/RESOLUTION/launcher.c similarity index 100% rename from ANALE-1/EXO1/launcher.c rename to ANALE-1/EXO1/RESOLUTION/launcher.c diff --git a/ANALE-1/EXO1/prod.c b/ANALE-1/EXO1/RESOLUTION/prod.c similarity index 100% rename from ANALE-1/EXO1/prod.c rename to ANALE-1/EXO1/RESOLUTION/prod.c diff --git a/ANALE-1/EXO1/SUJET/Makefile b/ANALE-1/EXO1/SUJET/Makefile new file mode 100644 index 0000000..9637004 --- /dev/null +++ b/ANALE-1/EXO1/SUJET/Makefile @@ -0,0 +1,17 @@ +CFLAGS=-Wall -Wextra -g +OBJS=prod.o conso.o dijkstra.o launcher.o +all: conso prod launcher + +prod: prod.o dijkstra.o +conso: conso.o dijkstra.o +launcher: launcher.o dijkstra.o + +conso.o: conso.c dijkstra.h commun.h +prod.o: prod.c dijkstra.h commun.h +launcher.o: launcher.c dijkstra.h commun.h +dijkstra.o: dijkstra.c dijkstra.h + +.PHONY: clean +clean: + rm $(OBJS) conso prod launcher + diff --git a/ANALE-1/EXO1/SUJET/commun.h b/ANALE-1/EXO1/SUJET/commun.h new file mode 100644 index 0000000..1362078 --- /dev/null +++ b/ANALE-1/EXO1/SUJET/commun.h @@ -0,0 +1,11 @@ +#ifndef COMMUN_H +#define COMMUN_H + +#define MEM 3 +#define SEM 5 + +#define CLE_SEM_PROD 100 +#define CLE_SEM_CONSO 200 +#define CLE_MEM 100 + +#endif diff --git a/ANALE-1/EXO1/SUJET/conso.c b/ANALE-1/EXO1/SUJET/conso.c new file mode 100644 index 0000000..bba5147 --- /dev/null +++ b/ANALE-1/EXO1/SUJET/conso.c @@ -0,0 +1,23 @@ +#include +#include +#include +#include +#include "dijkstra.h" +#include "commun.h" + +int main () { + int sem_prod = sem_create (CLE_SEM_PROD ,SEM); + int sem_conso = sem_create (CLE_SEM_CONSO ,0); + int shmid = shmget(CLE_MEM,MEM*sizeof(int),0644); + int* shmem = shmat(shmid,NULL,0); + for (int i = 0; i < 26; i++) + { + P(sem_conso); + char c = shmem[i%MEM]; + V(sem_prod); + printf("%c",c); + } + printf("\n"); + shmdt(shmem); + return 0; +} diff --git a/ANALE-1/EXO1/SUJET/dijkstra.c b/ANALE-1/EXO1/SUJET/dijkstra.c new file mode 100644 index 0000000..135570d --- /dev/null +++ b/ANALE-1/EXO1/SUJET/dijkstra.c @@ -0,0 +1,57 @@ +#include +#include +#include + +#include "dijkstra.h" + +int sem_create(key_t cle, int initval) { + int semid; + union semun { int val; struct semid_ds *buf; ushort *array; } arg_ctl; + + semid = semget(cle, 1 , IPC_CREAT|IPC_EXCL|0666); + if (semid == -1) + { + semid = semget(cle,1, 0666); + if (semid == -1) + { + perror("Erreur semget()"); + exit(1); + } + } + else + { + arg_ctl.val = initval; + if (semctl(semid, 0, SETVAL, arg_ctl) == -1) + { + perror("Erreur initialisation sémaphore"); + exit(1); + } + } + return(semid) ; +} + +void P(int semid) +{ + struct sembuf sempar; + sempar.sem_num = 0; + sempar.sem_op = -1; + sempar.sem_flg = 0; + if (semop(semid, &sempar, 1) == -1) + perror("Erreur operation P"); +} + +void V(int semid) +{ + struct sembuf sempar; + sempar.sem_num = 0; + sempar.sem_op = 1; + sempar.sem_flg = 0; + if (semop(semid, &sempar, 1) == -1) + perror("Erreur opération V"); +} + +void sem_delete(int semid) +{ + if (semctl(semid,0,IPC_RMID,0) == -1) + perror("Erreur dans destruction sémaphore"); +} diff --git a/ANALE-1/EXO1/SUJET/dijkstra.h b/ANALE-1/EXO1/SUJET/dijkstra.h new file mode 100644 index 0000000..25abaef --- /dev/null +++ b/ANALE-1/EXO1/SUJET/dijkstra.h @@ -0,0 +1,27 @@ +#ifndef DIJKSTRA_H +#define DIJKSTRA_H + +#include + +/** + * return the semaphore associated to the key cle + * if the semaphore doesn't already exist the function create it with initval token then return it + */ +int sem_create(key_t cle, int initval); + +/** + * take a token on the semaphore semid or wait if none available + */ +void P(int semid); + +/** + * put a token on the semaphore semid + */ +void V(int semid); + +/** + * delete the semaphore semid + */ +void sem_delete(int semid); + +#endif diff --git a/ANALE-1/EXO1/SUJET/launcher.c b/ANALE-1/EXO1/SUJET/launcher.c new file mode 100644 index 0000000..071f177 --- /dev/null +++ b/ANALE-1/EXO1/SUJET/launcher.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include +#include +#include "dijkstra.h" +#include "commun.h" + +int main () { + int sem_prod = sem_create (CLE_SEM_PROD ,SEM); + int sem_conso = sem_create (CLE_SEM_CONSO ,0); + int shmid = shmget(CLE_MEM,MEM*sizeof(int),IPC_CREAT|IPC_EXCL|0644); + if (shmid == -1) + shmid = shmget(CLE_MEM,MEM*sizeof(int),0644); + int* shmem = shmat(shmid,NULL,0); + memset(shmem,0,MEM*sizeof(int)); + if (fork() == 0) + { + puts("consommateur"); + execlp("./conso","./conso",NULL); + } + if (fork() == 0) + { + puts("producteur"); + sleep(3); + execlp("./prod","./prod",NULL); + } + wait(NULL); + wait(NULL); + shmdt(shmem); + shmctl(shmid,IPC_RMID,NULL); + sem_delete(sem_prod); + sem_delete(sem_conso); + return 0; +} diff --git a/ANALE-1/EXO1/SUJET/prod.c b/ANALE-1/EXO1/SUJET/prod.c new file mode 100644 index 0000000..32d0b54 --- /dev/null +++ b/ANALE-1/EXO1/SUJET/prod.c @@ -0,0 +1,21 @@ +#include +#include +#include +#include +#include "dijkstra.h" +#include "commun.h" + +int main () { + int sem_prod = sem_create (CLE_SEM_PROD ,SEM); + int sem_conso = sem_create (CLE_SEM_CONSO ,0); + int shmid = shmget(CLE_MEM,MEM*sizeof(int),0644); + int* shmem = shmat(shmid,NULL,0); + for (int i = 0; i < 26; i++) + { + P(sem_prod); + shmem[i%MEM] = 'a'+i; + V(sem_conso); + } + shmdt(shmem); + return 0; +}