#include <stdio.h> #include <sys/ipc.h> #include <sys/sem.h> #include <sys/shm.h> #include <stdlib.h> #include <unistd.h> int main (void) { // 1. Generamos la estructura struct sembuf op; // 2. Memoria compartida int id_mem; int *var; if ((id_mem = shmget(IPC_PRIVATE,sizeof(int), IPC_CREAT | 0600)) == -1){ perror("shmget"); exit(1); } var = shmat(id_mem,0,0); (*var) = 0; // 3. Generación del semáforo int id_sem; if ((id_sem = semget(IPC_PRIVATE,1,0777)) == -1) { perror("semget"); exit(1); } // 4. Inicialización del semáforo semctl(id_sem,0,SETVAL,1); op.sem_num = 0; op.sem_flg = 0; // 5. Lanzamos los procesos fork() fork(); fork(); fork(); // 6. Pasamos los procesos por el semáforo for (int i = 0; i < 10 ; i++) { op.sem_op = -1; semop(id_sem,&op,1); (*var)++; printf ("El valor de var: %d \n",*var); op.sem_op = 1; semop(id_sem,&op,1); } // 7. Eliminamos la memoria compartida así como el semáforo semctl(id_sem,0,IPC_RMID); shmdt(var); shmctl(id_mem,IPC_RMID,0); return 0; }
lunes, 6 de enero de 2020
Memoria compartida, semáforos y procesos
Generar una aplicación multiproceso controlada por un semáforo.