Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/sem.h>
- #include <wait.h>
- #include <signal.h>
- #include <sys/shm.h>
- #define KEY_WRITE 857694
- #define KEY_READ 986531
- #define KEY_MEMORY 957684
- int sem_del(int semid);
- int sem_set(int semid, int value);
- int sem_up(int semid);
- int sem_down(int semid);
- union semun
- {
- int val;
- struct semid_ds *buf;
- unsigned short *array;
- };
- struct s_m
- {
- int written;
- char message[256];
- };
- int main()
- {
- int sem_write, sem_read;
- int shmid;
- void *shared_address;
- struct s_m *shared_memory;
- sem_write = semget((key_t) KEY_WRITE, 1, 0666 | IPC_CREAT);
- sem_read = semget((key_t) KEY_READ, 1, 0666 | IPC_CREAT);
- shmid = shmget((key_t) KEY_MEMORY, sizeof(struct s_m), 0666 | IPC_CREAT);
- sem_set(sem_write, 1);
- sem_set(sem_read, 0);
- pid_t pid = fork();
- switch(pid)
- {
- case -1:
- printf("Errore fork.\n");
- exit(EXIT_FAILURE);
- case 0: // Figlio
- sem_write = semget((key_t) KEY_WRITE, 1, 0666 | IPC_CREAT);
- sem_read = semget((key_t) KEY_READ, 1, 0666 | IPC_CREAT);
- shmid = shmget((key_t) KEY_MEMORY, sizeof(shared_memory), 0666 | IPC_CREAT);
- shared_memory = (struct s_m *)shmat(shmid, (void *) 0, 0);
- printf("[FIGLIO] Ciao, sono stato avviato. Accedo alla regione critica ...\n");
- sem_down(sem_write);
- int i = 0;
- while(i < 10)
- {
- sprintf(shared_memory->message, "[%d] MSG", i);
- i ++;
- sem_up(sem_read);
- sem_down(sem_write);
- }
- sprintf(shared_memory->message, "end");
- sem_up(sem_read);
- printf("[FIGLIO] Ho terminato le mie operazioni.\n");
- break;
- default: // Padre
- shared_address = shmat(shmid, (void *) 0, 0);
- printf("[PADRE] Ciao, sono stato avviato. Accedo alla regione critica ...\n");
- shared_memory = (struct s_m *)shared_address;
- sem_down(sem_read);
- while(strcmp(shared_memory->message, "end") != 0)
- {
- printf("[PADRE] Il contenuto del messaggio รจ: %s.\n", shared_memory->message);
- sem_up(sem_write);
- sem_down(sem_read);
- }
- printf("[PADRE] Mio figlio mi ha comandato di terminare.\n");
- fflush(stdout);
- break;
- }
- }
- int sem_del(int semid)
- {
- if(semctl(semid, 0, IPC_RMID) == -1)
- {
- printf("Error deleting semaphore.\n");
- return -1;
- }
- return 0;
- }
- int sem_set(int semid, int value)
- {
- union semun sn;
- sn.val = value;
- if(semctl(semid, 0, SETVAL, sn) == -1)
- {
- printf("Error setting value.\n");
- return -1;
- }
- return 0;
- }
- int sem_up(int semid)
- {
- struct sembuf sb;
- sb.sem_num = 0;
- sb.sem_op = 1;
- sb.sem_flg = SEM_UNDO;
- if(semop(semid, &sb, 1) == -1)
- {
- printf("Error upping semaphore.\n");
- return -1;
- }
- return 0;
- }
- int sem_down(int semid)
- {
- struct sembuf sb;
- sb.sem_num = 0;
- sb.sem_op = -1;
- sb.sem_flg = SEM_UNDO;
- if(semop(semid, &sb, 1) == -1)
- {
- printf("Error downing semaphore.\n");
- return -1;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement