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;
}