Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * ESERCIZIO CON SEMAFORI E SHARED MEMORY, DI MARCO ANDRONACO
- * Vi siano tre processi P1 P2 P3. P1 deve leggere una stringa inserita da tastiera da parte dell'utente.
- * P1 dopodichè mediante una memoria condivisa deve mandare la stringa ad u processo P2.
- * La seconda stringa che riceve P1, dovrà essere inviata a P3.
- * Il ciclo di invio è P2-P3. Se viene inviata la stringa EXIT a P1, questa deve essere mandata ad entrambi i processi P2 e P3.
- * Con EXIT i processi devono chiudersi.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <string.h>
- #include <sys/sem.h>
- #define BUF_SIZE 128
- union semun { //va sempre inclusa per assicurare la portabilita' del codice
- int val;
- struct semid_ds *buf;
- unsigned short *array;
- };
- void * stringa = (void *)0;
- int turno = 2;
- //prototipi funzioni semafori
- int sem_down(int sem_id);
- int sem_up(int sem_id);
- int sem_set(int sem_id, int val);
- int main(void){
- pid_t P1, P2, P3;
- int shmid;
- int semid1, semid2, semid3;
- int run = 1;
- shmid = shmget((key_t)1234, sizeof(stringa), 0666 | IPC_CREAT);
- if (shmid == -1) {
- puts("Errore nella shmget!!");
- exit(EXIT_FAILURE);
- }
- semid1 = semget((key_t)3333, 1, 0666 | IPC_CREAT);
- semid2 = semget((key_t)4444, 1, 0666 | IPC_CREAT);
- semid3 = semget((key_t)5555, 1, 0666 | IPC_CREAT);
- sem_set(semid1, 1);
- sem_set(semid2, 0);
- sem_set(semid3, 0);
- P1 = getpid();
- P2 = fork();
- switch(P2){
- case -1:
- puts("Errore nella prima fork!!");
- exit(EXIT_FAILURE);
- case 0: //INIZIO P2
- P3 = fork();
- switch(P3){
- case -1:
- puts("Errore nella seconda fork!!");
- exit(EXIT_FAILURE);
- case 0: //CODICE DI P3
- stringa = shmat(shmid, (void *)0, 0);
- do {
- sem_down(semid3);
- if (!strcmp("EXIT", stringa)){
- puts("P3: Ho letto exit, esco.");
- exit(EXIT_SUCCESS);
- }
- printf("\nP3: Hai scritto '%s'.\n", stringa);
- sem_up(semid1);
- } while (1);
- break;
- default: //CODICE DI P2
- stringa = shmat(shmid, (void *)0, 0);
- do {
- sem_down(semid2);
- if (!strcmp("EXIT", stringa)){
- puts("P2: Ho letto exit, esco.");
- exit(EXIT_SUCCESS);
- }
- printf("\nP2: Hai scritto '%s'.\n", stringa);
- sem_up(semid1);
- } while (1);
- break;
- }
- break;
- default: //CODICE DI P1:
- stringa = shmat(shmid, (void *)0, 0);
- do {
- sem_down(semid1);
- printf("Ciao, inserisci la stringa da passare: ");
- scanf("%s", (void *)stringa);
- if (!strcmp("EXIT", stringa)){
- //chiude P2 e P3: aggiungere questa parte dopo
- sem_up(semid2);
- sem_up(semid3);
- run = 0;
- } else {
- if(turno == 2){
- sem_up(semid2);
- turno = 3;
- } else if(turno == 3){
- sem_up(semid3);
- turno = 2;
- }
- }
- } while(run);
- //detach e pulizia di memoria e semafori
- shmdt(shmid);
- shmctl(stringa, IPC_RMID, NULL);
- semctl(semid1, 1, IPC_RMID);
- semctl(semid2, 1, IPC_RMID);
- semctl(semid3, 1, IPC_RMID);
- }
- }
- int sem_down(int sem_id){
- struct sembuf buf;
- buf.sem_num = 0;
- buf.sem_op = -1;
- buf.sem_flg = SEM_UNDO;
- semop(sem_id, &buf, 1);
- }
- int sem_up(int sem_id){
- struct sembuf buf;
- buf.sem_num = 0;
- buf.sem_op = 1;
- buf.sem_flg = SEM_UNDO;
- semop(sem_id, &buf, 1);
- }
- int sem_set(int sem_id, int val){
- union semun un;
- un.val = val;
- semctl(sem_id, 0, SETVAL, un);
- }
Add Comment
Please, Sign In to add comment