Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*******************************************
- * Author : Diego Cordoba / @d1cor *
- * Purpose : JuncoTIC / UM *
- * Contact : juncotic.com *
- *******************************************/
- #include<stdio.h>
- #include<stdlib.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<unistd.h>
- #include<string.h>
- #include<fcntl.h>
- #include<errno.h>
- #include<sys/ipc.h>
- #include<sys/sem.h>
- int main(int argc, char** argv) {
- int fd; //recurso compartido
- int i,j;
- char* error;
- int sem_id;
- struct sembuf operacion;
- int clave;
- if((fd=open("/tmp/file_shared",O_CREAT|O_RDWR,0666))<0){
- error="open";
- goto err;
- }
- if((clave=ftok(".",11))<0){
- error="ftok";
- goto err;
- }
- if((sem_id=semget(clave,1,0666|IPC_CREAT))<0){
- error="semget";
- goto err;
- }
- //levantamos inicialmente el sem
- operacion.sem_num=0;
- operacion.sem_op=-1;
- semop(sem_id,&operacion,1);
- for(i=0;i<5;i++){
- //baja el semaforo
- operacion.sem_num=0;
- operacion.sem_op=-1;
- semop(sem_id,&operacion,1);
- printf("Proceso A escribiendo el archivo\n");
- for(j=0;j<3;j++){ //recurso compartido
- printf(".\n");
- lseek(fd,0,SEEK_END);
- write(fd,"A",1);
- sleep(1);
- }
- printf("Proceso A liberando el archivo\n");
- //levanta el semaforo
- operacion.sem_num=0;
- operacion.sem_op=1;
- semop(sem_id,&operacion,1);
- }
- close(fd);
- return 0;
- err:
- fprintf(stderr,"%s (%d) - %s\n",error,errno,strerror(errno));
- exit(1);
- }
- /*
- A:
- crea el semaforo en 0
- subo 1 el sem
- baja el sem -> queda bloqueado
- al terminar el uso, +1 al sem
- B:
- abre el semaforo
- baja el sem -> queda bloqueado
- al terminar, +1
- Usos: recursos compartidos
- shm (todo proceso con una key lo accede)
- fifo (todo proc con el filename lo accede)
- msq (todo proc con una key lo accede)
- file (todo proc con el filename lo accede)
- socket (todos los proc con el filename/puerto lo acceden)
- */
Add Comment
Please, Sign In to add comment