Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/banditopazzo/sala-cinema
Sistema di prenotazione di una sala cinema scritto in C per UNIX, Linux, macOS
https://github.com/banditopazzo/sala-cinema
cinema multithread multithreaded-tcp-server operating-system terminal-app unix unix-domain-socket unix-socket
Last synced: 14 days ago
JSON representation
Sistema di prenotazione di una sala cinema scritto in C per UNIX, Linux, macOS
- Host: GitHub
- URL: https://github.com/banditopazzo/sala-cinema
- Owner: banditopazzo
- License: mit
- Created: 2017-09-12T14:03:16.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2017-09-12T14:12:11.000Z (over 7 years ago)
- Last Synced: 2024-05-07T18:00:40.227Z (9 months ago)
- Topics: cinema, multithread, multithreaded-tcp-server, operating-system, terminal-app, unix, unix-domain-socket, unix-socket
- Language: C
- Size: 13.7 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Progetto per corso di Sistemi Operativi - Università degli Studi di Roma "La Sapienza"
### Sistema di prenotazione di una sala cinema scritto in C per UNIX, Linux, macOS.Il sistema composto da server e client, con funzioni di:
* visualizzazione dei posti liberi
* prenotazione di uno o più posti
* cancellazione prenotazione possedendo un codice di prenotazione## Caratteristiche
* ***Server Multiprocesso.***
Il sistema è stato realizzato con un server multiprocesso, ovvero quando un client si connette
il server genera un processo figlio che si occupa di gestire la connessione.* ***Semaforo per accesso al database.***
E’ stato necessario quindi l’uso di un semaforo per la sincronizzazione dell’accesso al
database ed è stato usato un semaforo di tipo IPC Unix System V. Quando un processo che si
occupa di gestire un client si trova nella sua sezione critica (accesso al database), gli altri
processi che tentano di entrare nelle loro sezioni critiche vengono bloccati e fatti ripartire
solo quando il primo termina la sua sezione critica.* ***Comunicazione client/server.***
La comunicazione tra client e server avviene tramite sockets nel dominio AF_INET in
modalità connessione. I numeri interi vengono convertiti in uint32_t prima di essere inviati e
ripristinati all’arrivo.* ***Gestione dei principali segnali di terminazione, SIGPIPE e SIGCHLD.***
Quando il server viene chiuso, il processo principale attende la chiusura dei processi figli per
poi terminare anch’esso. Se i processi figli ricevono il segnale di terminazione mentre si
trovano nella propria sezione critica, la concludono prima di terminare. Il client o i processi
figli sul server vengono interrotti all’arrivo di un segnale SIGPIPE, notificando l’accaduto.
Quando un processo figlio termina, invia un segnale SIGCHLD al padre che lo gestisce e fa
terminare completamente il figlio evitando che nel sistema rimangano processi zombie. La
gestione dei segnali avviene in modo affidabile tramite la struttura sigaction.* ***Strutture dati.*** I posti sono rappresentati con una struct formata da un carattere ad indicare
la fila e un intero per il numero di poltrona. Le prenotazioni sono rappresentate con una struct formata
da un elemento di tipo struct posto e un intero per il codice di prenotazione.* ***Database.***
Il database si trova in nella cartella puntata dalla variabile d’ambiente $HOME ed è
realizzato come un insieme di prenotazioni. Possono esserci più prenotazioni con lo stesso
codice identificativo, ma solo una prenotazione per posto. La lettura o scrittura del database
avviene tramite le primitive a basso livello e la lettura avviene in RAM dinamica.## Mappa dei posti disponibili
```
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
+--+--+--+--+--+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +--+--+--+--+--+
A ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ A
+--+--+--+--+--+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +--+--+--+--+--+
B ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ B
+--+--+--+--+--+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +--+--+--+--+--+
C ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ C
+--+--+--+--+--+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +--+--+--+--+--+
D ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ D
+--+--+--+--+--+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +--+--+--+--+--+
E ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ E
+--+--+--+--+--+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +--+--+--+--+--+
F ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ F
+--+--+--+--+--+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +--+--+--+--+--++--+--+--+--+--+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +--+--+--+--+--+
G ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ G
+--+--+--+--+--+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +--+--+--+--+--+
H ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ H
+--+--+--+--+--+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +--+--+--+--+--+
I ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ I
+--+--+--+--+--+ +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +--+--+--+--+--+
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30+----------------------------------------------------------------------------------+
| S C H E R M O |
+----------------------------------------------------------------------------------++--+ +--+
¦><¦ OCCUPATO ¦ ¦ DISPONIBILE
+--+ +--+
```## Come compilare e installare
* Compilare:
`$ make`
* Installare (necessari privilegi di amministratore):
`# make install`
* Disinstallare (necessari privilegi di amministratore):
`# make uninstall`
* Rimuovere programmi compilati:
`$ make clean`
* Eliminare il database delle prenotazioni:
`$ make deletedatabase`
## Come eseguire
* Avviare il server:
`$ serverSD -p porta`
* Avviare il client e connetterlo al server:
`$ clientSD -a indirizzo -p porta`
* Stampare il contenuto del database sul terminale:
`$ stampadatabaseSD`