Advertisement
d1cor

semaA.c

Oct 20th, 2016
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.94 KB | None | 0 0
  1. /*******************************************
  2. * Author     : Diego Cordoba / @d1cor      *
  3. * Purpose    : JuncoTIC / UM               *
  4. * Contact    : 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/ipc.h>
  16. #include<sys/sem.h>
  17. int main(int argc, char** argv) {
  18.  
  19.     int fd;     //recurso compartido
  20.     int i,j;
  21.     char* error;
  22.     int sem_id;
  23.     struct sembuf operacion;
  24.     int clave;
  25.    
  26.     if((fd=open("/tmp/file_shared",O_CREAT|O_RDWR,0666))<0){
  27.         error="open";
  28.         goto err;
  29.     }
  30.  
  31.     if((clave=ftok(".",11))<0){
  32.         error="ftok";
  33.         goto err;
  34.     }
  35.  
  36.     if((sem_id=semget(clave,1,0666|IPC_CREAT))<0){
  37.         error="semget";
  38.         goto err;
  39.     }
  40.  
  41.     //levantamos inicialmente el sem
  42.     operacion.sem_num=0;
  43.     operacion.sem_op=-1;
  44.     semop(sem_id,&operacion,1);
  45.  
  46.  
  47.     for(i=0;i<5;i++){
  48.         //baja el semaforo
  49.         operacion.sem_num=0;
  50.         operacion.sem_op=-1;
  51.         semop(sem_id,&operacion,1);
  52.         printf("Proceso A escribiendo el archivo\n");
  53.         for(j=0;j<3;j++){   //recurso compartido
  54.             printf(".\n");
  55.             lseek(fd,0,SEEK_END);
  56.             write(fd,"A",1);
  57.             sleep(1);
  58.         }
  59.         printf("Proceso A liberando el archivo\n");
  60.         //levanta el semaforo
  61.         operacion.sem_num=0;
  62.         operacion.sem_op=1;
  63.         semop(sem_id,&operacion,1);
  64.     }
  65.  
  66.     close(fd);
  67.  
  68.     return 0;
  69.  
  70. err:
  71.     fprintf(stderr,"%s (%d) - %s\n",error,errno,strerror(errno));
  72.     exit(1);
  73. }
  74.  
  75. /*
  76.  
  77. A:
  78.     crea el semaforo en 0
  79.     subo 1 el sem
  80.     baja el sem -> queda bloqueado
  81.     al terminar el uso, +1 al sem
  82.  
  83. B:
  84.     abre el semaforo
  85.     baja el sem -> queda bloqueado
  86.     al terminar, +1
  87.  
  88.  
  89. Usos: recursos compartidos
  90.     shm (todo proceso con una key lo accede)
  91.     fifo (todo proc con el filename lo accede)
  92.     msq (todo proc con una key lo accede)
  93.     file (todo proc con el filename lo accede)
  94.     socket (todos los proc con el filename/puerto lo acceden)
  95.  
  96. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement