Ciao a tutti, ho un problema con i semafori. Ho progettato un'applicazione multi-server/multi-client, e ho problemi con l'accesso ai semafori quando i server sono più di due.
Il codice relativo al server che crea ed inizializza i semafori prevede una funzione da me implementata, che non fa altro che chiamare la semget e la semctl su tutti i semafori:
codice:
int seminit(){
int id; /*id dei semafori*/
union semun {
int val;
struct semid_ds *buf;
ushort * array;
} argument;
id = semget(KEY, 2, 0666 | IPC_CREAT);
if(id < 0){
perror("Impossibile ottenere id semafori");
return -1;
}
/*Inizializzazione semafori al valore 0*/
if( semctl(id, WAIT_MSG, SETVAL, 0) < 0)
perror("Inizializzazione semaforo non riuscita");
if( semctl(id, WAIT_RES, SETVAL, 0) < 0)
perror("Inizializzazione semaforo non riuscita");
return id;
}
KEY è una macro definita in questo modo: ftok("./tmp", 'A').
Di tanto in tanto, sopratutto in fase di test, il server si arrestava erroneamente, non eliminando il set di semafori creato. Dunque ho cambiato più volte la 'A' in altre lettere, e tutto si è sistemato. Ora però, avviando con 3 server e cambiano nuovamente il secondo parametro di ftok, l'errore permane: semget ritorna con l'errno settata a "Permission Denied".
Il server una volta avviato esegue questo frammento di pseudocode, arrestandosi con errore al ritorno di seminit():
codice:
//Controllo dei parametri e gestione errore
semid = seminit();
if(semid < 0){
//gestione errore
return -1;
}
Tuttavia dando il comando ipcs -s da teminale, non ci sono semafori attivi, quindi non riesco proprio a spiegarmi il perchè! Qualcuno potrebbe aiutarmi? Potrebbe essere un problema di permessi?