In questa repository è presente l'implementazione dei semafori in DisastrOS.
Sono state implementate le seguenti funzioni dei semafori:
int sem_open(int id)
int sem_close(int fd)
int sem_wait(int fd)
int sem_post(int fd)
int sem_open(int id)
int id
: un intero che rappresenta il semaforo globalmente.
Crea un nuovo semaforo o ne apre uno già esistente con identificativo uguale al parametro della system call.
Viene aggiunto alla lista dei semafori aperti dal processo un SemDescriptor sem_des e al semaforo un SemDescriptorPtr relativo a sem_des.
In caso di successo viene ritornato un intero maggiore o uguale di zero, in caso di errore un intero negativo
DSOS_ESEM_MAX_NUMBER_OF_SEMDESCRIPTORS : sono stati aperti il numero massimo di semafori dal processo
DSOS_ESEM_NAME : l'id del semaforo è negativo, sono accettati solo id positivi
DSOS_ESEM_ALLOC : errore nella allocazione del nuovo semaforo
DSOS_ESEM_DES_ALLOC : errore nella allocazione del SemDescriptor del semaforo
DSOS_ESEM_DES_PTR_ALLOC : errore nella allocazione del SemDescriptorPtr del semaforo
int sem_close(int fd)
int fd
: il file descriptor del semaforo.
Chiude il semaforo (se il processo ha aperto più volte lo stesso semaforo, dovrà chiudere tutti i descrittori).
Libera SemDescriptor e SemDescriptorPtr rispettivamente presenti nella lista dei SemDescriptor del processo e nella lista dei SemDescriptorPtr del semaforo.
Se nessun processo condivide quel semafo erosegue l'operazione di unlink: libera la memoria occupata dal semaforo.
In caso di successo viene ritornato un intero maggiore o uguale di zero, in caso di errore un intero negativo
DSOS_ESEM_DES_NOT_FOUD : il file descriptor passato come parametro non è associato a nessun semaforo aperto dal processo
int sem_wait(int fd)
int fd
: il file descriptor del semaforo.
Decrementa il contatore del semaforo.
Se il valore del contatore è minore o uguale a -1
il processo è inserito nella waiting_list ed è allocato un SemDescriptorPtr che sarà inserito nella lista dei SemDescriptorPtr bloccati dal semaforo.
In caso di successo viene ritornato un intero maggiore o uguale di zero, in caso di errore un intero negativo
DSOS_ESEM_DES_NOT_FOUD : il file descriptor passato come parametro non è associato a nessun semaforo aperto dal processo
int sem_post(int fd)
int fd
: il file descriptor del semaforo.
Incrementa il contatore del semaforo.
Se il contatore diviene minore o uguale a zero viene rimosso un SemDescriptorPtr dalla lista dei processi bloccati dal semaforo, si ottiene il processo relativo che sarà inserito nella coda di ready. Il SemDescriptorPtr allocato nella sem_wait verrà liberato.
In caso di successo viene ritornato un intero maggiore o uguale di zero, in caso di errore un intero negativo
DSOS_ESEM_DES_NOT_FOUD: il file descriptor passato come parametro non è associato a nessun semaforo aperto dal processo
Per eseguire il programma bisogna:
compilare con il comando
make
quindi eseguire con il comando
./disastrOS_test
oppure se si vuole usare valgrind
valgrind ./disastrOS_test