Hola!

Registrándote como bakuno podrás publicar, compartir y comunicarte en privado con otros bakuos :D

Regístrame ya!

Ayuda semáforos en C

batiguason_11

Bovino adicto
Desde
27 Jun 2009
Mensajes
703
¿Qué tal gente del corral?

Veran tengo un problema con el siguiente código:
Código:
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<errno.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#define SEMPERM 0666
extern int errno;
int initsem(key_t key){
    int status=0,semid;
    if((semid=semget(key,1,SEMPERM|IPC_CREAT|IPC_EXCL))==-1)
        if(errno==EEXIST)
            semid=semget(key,1,0);
    else
        status=semctl(semid,0,SETVAL,1);
    if(semid==-1 || status==-1){
        perror("initsem");
        return (-1);
    }
    return semid;
}
int down(int semid){
    struct sembuf d_buf;
    d_buf.sem_num=0;
    d_buf.sem_op=-1;
    d_buf.sem_flg=SEM_UNDO;
    if(semop(semid,&d_buf,1)==-1){
        perror("down");
        exit(1);
    }
    return 0;
}
int up(int semid){
    struct sembuf u_buf;
    u_buf.sem_num=0;
    u_buf.sem_op=1;
    u_buf.sem_flg=SEM_UNDO;
    if(semop(semid,&u_buf,1)==-1){
        perror("up");
        exit(1);
    }
    return 0;
}
int trata(key_t key){
    int semid,pid=getpid();
    if((semid=initsem(key))<0)
        exit(1);
    printf("\nprocces %i before critical section\n",pid);
    down(semid);
    printf("\nprocess %i in critical section\n",pid);
    sleep(5);
    printf("\nprocess %i leaving critical section\n",pid);
    up(semid);
    printf("\nprocess %i exiting",pid);
    exit(0);
}
main(){
    char *path="/Users/kar/desktop";
    key_t my_key=ftok(path,4);
    if(fork()==0)
        trata(my_key);
    if(fork()==0)
        trata(my_key);
}

Verán mi problema es que nunca entra a la sección critica. Despues del mensaje "process n before critical section" se bloquea... Pero no sé el motivo, ya que en ningun momento invoca a mi función down. Si alguien pudiera ayudar estaría agradecido ^.^

Saludos y gracias!!
 
Volver
Arriba