[RISOLTO] Semplice programma con semafori

di il
2 risposte

[RISOLTO] Semplice programma con semafori

Ciao ragazzi, sto cercando di capire i semafori e per farlo volevo realizzare il seguente programma:
ci sono due processi P1 e P2. entrambi creano una memoria condivisa, P1 inizializza un semaforo e entrambi i processi tentanto di prendere il lock sul semaforo e stampare a schermo rispettivamente "processo1" e "processo2".
Diciamo che i due processi fanno praticamente le stesse cose a parte la creazione del semaforo che fa solo P1. [in questo programma si suppone che venga eseguito sempre prima P1 e poi P2].
Il problema è che P2 non stampa mai a scharmo. Sapete dirmi qual è il problema?


processo1

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <semaphore.h>

typedef struct shmem{
	sem_t semaforo;
} shmem;

//prototipi funzioni
shmem *creoMemoria(void);
void xerror(char *stringa);
void creaSemaforo(sem_t *semaforo);
void prendoSemaforo(sem_t *semaforo);
void rilasciaSemaforo(sem_t *semaforo);
//MAIN
int main(){
	shmem *memoria;
	memoria = creoMemoria();
	creaSemaforo(&(memoria->semaforo));
	while(1){
		prendoSemaforo(&(memoria->semaforo));
		int i=0;
		for (i=0;i<3;i++){
			fprintf(stderr,"sono il processo1 \n");
			sleep(1);
		}
		sleep(1);sleep(1);
		rilasciaSemaforo(&(memoria->semaforo));
	}
	return EXIT_SUCCESS;
}

//funzione per controllare errori
void xerror(char *stringa){
	perror(stringa);
	exit (EXIT_FAILURE);
}

//funzione per creare memoria condivisa
shmem* creoMemoria(void){
	key_t key = ftok(".", 'd'); 
	size_t size = sizeof(shmem);
	int id = shmget(key,size,IPC_CREAT | 0666);
	if (id == -1){
		xerror("error shmget");
	}
	shmem *memoria;
	memoria = (shmem*) shmat(id,NULL,0666);
	if (memoria == (void*)(-1)){
		xerror("error shmat");
	}
	return memoria;
}

//crea semaforo
void creaSemaforo(sem_t *semaforo){
	int s;
	s = sem_init(semaforo,1,1);
	if (s == -1)
		xerror("errore inizializzazione semaforo\n");
	return;
}

//prendo il semaforo
void prendoSemaforo(sem_t *semaforo){
	int s;
	s = sem_wait(semaforo);
	if (s == -1)
		xerror("errore sem_wait\n");
	return;
}

//rilascia semaforo
void rilasciaSemaforo(sem_t *semaforo){
	int s;
	s = sem_post(semaforo);
	if (s == -1)
		xerror("errore sem_post\n");
	return;
}
processo2

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <semaphore.h>

typedef struct shmem{
	sem_t semaforo;
} shmem;

//prototipi funzioni
shmem *creoMemoria(void);
void xerror(char *stringa);
void prendoSemaforo(sem_t *semaforo);
void rilasciaSemaforo(sem_t *semaforo);
//MAIN
int main(){
	shmem *memoria;
	memoria = creoMemoria();
	while(1){
		prendoSemaforo(&(memoria->semaforo));
		int i=0;
		for (i=0;i<10;i++){
			fprintf(stderr,"sono il processo2 \n");
		}
		rilasciaSemaforo(&(memoria->semaforo));
	}
	return EXIT_SUCCESS;
}

//funzione per controllare errori
void xerror(char *stringa){
	perror(stringa);
	exit (EXIT_FAILURE);
}

//funzione per creare memoria condivisa
shmem* creoMemoria(void){
	key_t key = ftok(".", 'd'); 
	size_t size = sizeof(shmem);
	int id = shmget(key,size,IPC_CREAT | 0666);
	if (id == -1){
		xerror("error shmget");
	}
	shmem *memoria;
	memoria = (shmem*) shmat(id,NULL,0666);
	if (memoria == (void*)(-1)){
		xerror("error shmat");
	}
	return memoria;
}


//prendo il semaforo
void prendoSemaforo(sem_t *semaforo){
	int s;
	s = sem_wait(semaforo);
	if (s == -1)
		xerror("errore sem_wait\n");
	return;
}

//rilascia semaforo
void rilasciaSemaforo(sem_t *semaforo){
	int s;
	s = sem_post(semaforo);
	if (s == -1)
		xerror("errore sem_post\n");
	return;
}

2 Risposte

  • Re: [RISOLTO] Semplice programma con semafori

    Mi sfugge qualcosa.

    Il processo master qual è?

    La logica non dovrebbe essere:
    
    int main(){
       /* inizializzazione semaforo */
       /*fork*/
       if(  )
          processo1();
       else
          processo2();
    
        return 0;
    }
    
    processo1(){
        /* protegge la sezione critica con il semaforo */
       ...
       fa quello che deve fare
    
       /* rilascia la sezione critica */
    }
    
    processo2(){
        /* protegge la sezione critica con il semaforo */
       ...
       fa quello che deve fare
    
       /* rilascia la sezione critica */
    }
    
  • Re: [RISOLTO] Semplice programma con semafori

    Ragazzi funzionava, l'unico problema è che non mettevo un sleep(..) dopo aver rilasciato il semaforo quindi era sempre lo stesso processo ad acquisire il semaforo.

    per SVNiko potevo farlo anche cosi ma la shered memory funziona tra qualsiasi processo non solo tra padre - figlio.
Devi accedere o registrarti per scrivere nel forum
2 risposte