Advertisement
d1cor

semaforos1.c

Oct 20th, 2016
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.47 KB | None | 0 0
  1. /*******************************************
  2. * Author     : Diego Cordoba / @d1cor      *
  3. * Purpose    : Juncotic.com                *
  4. * Contact    : diego@juncotic.com          *
  5. *******************************************/
  6.  
  7. #include<stdio.h>
  8. #include<stdlib.h>
  9. #include<sys/types.h>
  10. #include<sys/stat.h>
  11. #include<unistd.h>
  12. #include<string.h>
  13. #include<fcntl.h>
  14. #include<errno.h>
  15. #include<sys/sem.h>
  16. #include<sys/ipc.h>
  17. int main(int argc, char** argv) {
  18.  
  19.     key_t clave;
  20.     struct sembuf operacion;
  21.     char *error;
  22.     int sem_id, i;
  23.  
  24.     if((clave=ftok(".",14))<0){
  25.         error="ftok";
  26.         goto err;
  27.     }
  28.  
  29.     if((sem_id=semget(clave,1,IPC_CREAT|0777))<0){
  30.         error="semget";
  31.         goto err;
  32.     }
  33.  
  34.     //almacenamos la operacion, bajar el semaforo
  35.     operacion.sem_num=0;
  36.     operacion.sem_op=1;
  37.     semop(sem_id,&operacion,1);
  38.  
  39.     if(fork()==0){      //hijo
  40.         for(i=0;i<5;i++){
  41.             operacion.sem_op=-1;
  42.             semop(sem_id,&operacion,1);
  43.             printf("hijo usando recurso\n");
  44.             sleep(1);
  45.             printf("Hijo liberando recurso\n");
  46.             operacion.sem_op=1;
  47.             semop(sem_id,&operacion,1);
  48.         }
  49.         return 0;
  50.     }
  51.  
  52.     //padre
  53.  
  54.     for(i=0;i<5;i++){
  55.         operacion.sem_op=-1;
  56.         semop(sem_id,&operacion,1);
  57.         printf("Padre usando el recurso...\n");
  58.         sleep(2);
  59.         printf("Padre liberando el recurso...\n");
  60.         operacion.sem_op=1;
  61.         semop(sem_id,&operacion,1);
  62.     }
  63.  
  64.     wait(NULL);
  65.  
  66.     //eliminamos el semaforo
  67.     semctl(sem_id,IPC_RMID,1);
  68.  
  69.     return 0;
  70.  
  71. err:
  72.     fprintf(stderr,"%s - %d: %s\n",error,errno,strerror(errno));
  73.     exit(1);
  74.  
  75. }
  76.  
  77. /*
  78. Semaforos
  79.     control de recursos compartidos
  80.         segmentos de memoria compartida
  81.         segmentos de memoria mapeada
  82.         fifos
  83.         ....
  84.  
  85.  
  86. Trabajamos con sets de semaforos
  87.  
  88. Pasos:
  89.     crear la clave
  90.     crear el set de semaforos
  91.     almacenar una operacion
  92.     ejecutar la operacion
  93.         levantar el semaforo (liberarlo)
  94.         bajar el semaforo (bloquearlo)
  95.             o entramos y bloqueamos el recurso
  96.             o quedamos en stand-by esperando que se libere para usarlo
  97.  
  98. semget
  99.        #include <sys/types.h>
  100.        #include <sys/ipc.h>
  101.        #include <sys/sem.h>
  102.        int semget(key_t key, int nsems, int semflg);
  103.         key: clave
  104.         nsems: cant de semaforos del set
  105.         semflg: flags de creacion, IPC_CREAT, 0666
  106.  
  107.  
  108. semop
  109.     int semop(int semid, struct sembuf *sops, unsigned nsops);
  110.         semid: id del sem
  111.         sops: dir de memoria de la operacion (struct sembuf *)
  112.         nsops: cantidad de operaciones a ejecutar
  113.  
  114. Interbloqueo
  115.     bloqueo mutuo, dead lock
  116.     los procesos se bloquean y no tienen forma de liberarse
  117.  
  118. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement