Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*******************************************
- * Author : Diego Cordoba / @d1cor *
- * Purpose : Juncotic.com *
- * Contact : diego@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/sem.h>
- #include<sys/ipc.h>
- int main(int argc, char** argv) {
- key_t clave;
- struct sembuf operacion;
- char *error;
- int sem_id, i;
- if((clave=ftok(".",14))<0){
- error="ftok";
- goto err;
- }
- if((sem_id=semget(clave,1,IPC_CREAT|0777))<0){
- error="semget";
- goto err;
- }
- //almacenamos la operacion, bajar el semaforo
- operacion.sem_num=0;
- operacion.sem_op=1;
- semop(sem_id,&operacion,1);
- if(fork()==0){ //hijo
- for(i=0;i<5;i++){
- operacion.sem_op=-1;
- semop(sem_id,&operacion,1);
- printf("hijo usando recurso\n");
- sleep(1);
- printf("Hijo liberando recurso\n");
- operacion.sem_op=1;
- semop(sem_id,&operacion,1);
- }
- return 0;
- }
- //padre
- for(i=0;i<5;i++){
- operacion.sem_op=-1;
- semop(sem_id,&operacion,1);
- printf("Padre usando el recurso...\n");
- sleep(2);
- printf("Padre liberando el recurso...\n");
- operacion.sem_op=1;
- semop(sem_id,&operacion,1);
- }
- wait(NULL);
- //eliminamos el semaforo
- semctl(sem_id,IPC_RMID,1);
- return 0;
- err:
- fprintf(stderr,"%s - %d: %s\n",error,errno,strerror(errno));
- exit(1);
- }
- /*
- Semaforos
- control de recursos compartidos
- segmentos de memoria compartida
- segmentos de memoria mapeada
- fifos
- ....
- Trabajamos con sets de semaforos
- Pasos:
- crear la clave
- crear el set de semaforos
- almacenar una operacion
- ejecutar la operacion
- levantar el semaforo (liberarlo)
- bajar el semaforo (bloquearlo)
- o entramos y bloqueamos el recurso
- o quedamos en stand-by esperando que se libere para usarlo
- semget
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- int semget(key_t key, int nsems, int semflg);
- key: clave
- nsems: cant de semaforos del set
- semflg: flags de creacion, IPC_CREAT, 0666
- semop
- int semop(int semid, struct sembuf *sops, unsigned nsops);
- semid: id del sem
- sops: dir de memoria de la operacion (struct sembuf *)
- nsops: cantidad de operaciones a ejecutar
- Interbloqueo
- bloqueo mutuo, dead lock
- los procesos se bloquean y no tienen forma de liberarse
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement