#include #include #include #include #include #include #include #include #include #include int *mem_con; int pid1, pid2, pid_figlio; int fd_fifo, sem_id, shm_id; void sig_usr(int signo) { printf("\n I am in the signal handler\n"); fd_fifo = open("FIFO", O_RDONLY); kill(pid_figlio, SIGINT); read(fd_fifo, &pid1, sizeof(int)); read(fd_fifo, &pid2, sizeof(int)); kill(pid1, SIGINT); kill(pid2, SIGINT); printf("\n memoria condivisa : %d\n", *mem_con); semctl(sem_id, 0, IPC_RMID, 0); shmctl(shm_id, IPC_RMID, 0); exit(0); } int main(int argc, char *argv[]) { int pid, pos=0; struct sembuf restore={0,3,0}; struct sembuf aspetta={0,0,0}; pid = getpid(); shm_id = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT | 0666); printf("\n Ho creato memoria condivisa con id: %d\n", shm_id); if((sem_id = semget(IPC_PRIVATE, 1, IPC_CREAT| IPC_EXCL | 0666)) < 0) printf("\n Errore creazione semaforo\n"); printf("\n Ho creato il semaforo con id: %d\n", sem_id); mem_con = (int *)shmat(shm_id, 0, 0); *mem_con = atoi(argv[1]); semop(sem_id, &restore, 1); mkfifo("FIFO", O_CREAT | 0666); pid_figlio = fork(); if(pid_figlio == 0) { fd_fifo = open("FIFO", O_RDONLY); pause(); exit(0); } signal(SIGALRM, sig_usr); alarm(20); while(1) { semop(sem_id, &aspetta, 1); printf("\n Pid = %d: mem. cond = %d\n",pid, (int)*mem_con); sleep(1); semop(sem_id, &restore, 1); } }