lunes, 6 de enero de 2020

Memoria compartida, semáforos y procesos

Generar una aplicación multiproceso controlada por un semáforo.


#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;
}