Podcast
Questions and Answers
Cosa restituisce la funzione mkfifo() in caso di successo?
Cosa restituisce la funzione mkfifo() in caso di successo?
Quale tra questi non è un permesso specificato per il nuovo FIFO?
Quale tra questi non è un permesso specificato per il nuovo FIFO?
Qual è il significato di S_ISUID nel contesto dei permessi dei file?
Qual è il significato di S_ISUID nel contesto dei permessi dei file?
Come viene specificato il mode per i permessi del nuovo FIFO?
Come viene specificato il mode per i permessi del nuovo FIFO?
Signup and view all the answers
Qual è il valore ottale di S_IRUSR?
Qual è il valore ottale di S_IRUSR?
Signup and view all the answers
Cosa accade quando un lettore tenta di leggere dati da una facility vuota?
Cosa accade quando un lettore tenta di leggere dati da una facility vuota?
Signup and view all the answers
Qual è l'importanza della sincronizzazione nella memoria condivisa?
Qual è l'importanza della sincronizzazione nella memoria condivisa?
Signup and view all the answers
Quale strumento è frequentemente utilizzato per la sincronizzazione nella memoria condivisa?
Quale strumento è frequentemente utilizzato per la sincronizzazione nella memoria condivisa?
Signup and view all the answers
Quale affermazione è vera riguardo alla memoria condivisa?
Quale affermazione è vera riguardo alla memoria condivisa?
Signup and view all the answers
Cosa si intende generalmente con il termine 'interprocess communication' (IPC)?
Cosa si intende generalmente con il termine 'interprocess communication' (IPC)?
Signup and view all the answers
Qual è la principale funzione di un FIFO nei processi?
Qual è la principale funzione di un FIFO nei processi?
Signup and view all the answers
Cosa accade quando un processo apre un FIFO in modalità lettura?
Cosa accade quando un processo apre un FIFO in modalità lettura?
Signup and view all the answers
Quale condizione deve essere soddisfatta affinché l'apertura di un FIFO in scrittura abbia successo?
Quale condizione deve essere soddisfatta affinché l'apertura di un FIFO in scrittura abbia successo?
Signup and view all the answers
Cosa accade se l'altra estremità di un FIFO è già aperta?
Cosa accade se l'altra estremità di un FIFO è già aperta?
Signup and view all the answers
Quale affermazione riguardo ai flag di apertura di un FIFO è corretta?
Quale affermazione riguardo ai flag di apertura di un FIFO è corretta?
Signup and view all the answers
Qual è la funzione di popen() nel contesto di un sistema operativo?
Qual è la funzione di popen() nel contesto di un sistema operativo?
Signup and view all the answers
Cosa viene restituito dalla funzione pclose() in caso di successo?
Cosa viene restituito dalla funzione pclose() in caso di successo?
Signup and view all the answers
Quale dei seguenti è un aspetto negativo dell'utilizzo della funzione popen()?
Quale dei seguenti è un aspetto negativo dell'utilizzo della funzione popen()?
Signup and view all the answers
Quale è il corretto utilizzo della funzione popen()?
Quale è il corretto utilizzo della funzione popen()?
Signup and view all the answers
Qual è la principale differenza tra un FIFO e un pipe?
Qual è la principale differenza tra un FIFO e un pipe?
Signup and view all the answers
Cosa dovrebbe essere fatto dopo aver completato le operazioni di I/O con popen()?
Cosa dovrebbe essere fatto dopo aver completato le operazioni di I/O con popen()?
Signup and view all the answers
Quale valore indica che si è verificato un errore nella funzione pclose()?
Quale valore indica che si è verificato un errore nella funzione pclose()?
Signup and view all the answers
Cosa fa il comando 'ls' passato a popen() nel codice fornito?
Cosa fa il comando 'ls' passato a popen() nel codice fornito?
Signup and view all the answers
Qual è la funzione principale di una FIFO nel contesto di un'applicazione client-server?
Qual è la funzione principale di una FIFO nel contesto di un'applicazione client-server?
Signup and view all the answers
Come viene costruito il nome della FIFO per ciascun client?
Come viene costruito il nome della FIFO per ciascun client?
Signup and view all the answers
Quale delle seguenti affermazioni è vera riguardo i dati in pipe e FIFO?
Quale delle seguenti affermazioni è vera riguardo i dati in pipe e FIFO?
Signup and view all the answers
Cosa devono fare il mittente e il destinatario in una comunicazione che utilizza FIFO?
Cosa devono fare il mittente e il destinatario in una comunicazione che utilizza FIFO?
Signup and view all the answers
Cosa deve sapere il server riguardo alla FIFO del client per rispondere correttamente?
Cosa deve sapere il server riguardo alla FIFO del client per rispondere correttamente?
Signup and view all the answers
Qual è un esempio di come viene costruito un percorso FIFO per un client?
Qual è un esempio di come viene costruito un percorso FIFO per un client?
Signup and view all the answers
Quale approccio può essere utilizzato per separare i messaggi in una FIFO?
Quale approccio può essere utilizzato per separare i messaggi in una FIFO?
Signup and view all the answers
Cosa rappresenta l'ID di processo (PID) in relazione alla FIFO del client?
Cosa rappresenta l'ID di processo (PID) in relazione alla FIFO del client?
Signup and view all the answers
Cosa accade se si tenta di decrementare il valore di un semaforo sotto zero?
Cosa accade se si tenta di decrementare il valore di un semaforo sotto zero?
Signup and view all the answers
Qual è la principale differenza tra un pipe e un FIFO?
Qual è la principale differenza tra un pipe e un FIFO?
Signup and view all the answers
Come fa la shell a utilizzare l'output di un processo come input per un altro?
Come fa la shell a utilizzare l'output di un processo come input per un altro?
Signup and view all the answers
Che funzione viene utilizzata per creare un nuovo processo in un sistema operativo?
Che funzione viene utilizzata per creare un nuovo processo in un sistema operativo?
Signup and view all the answers
Quale comando permette di contare il numero di file in una directory?
Quale comando permette di contare il numero di file in una directory?
Signup and view all the answers
Cosa rappresenta il file descriptor nel contesto di un pipe?
Cosa rappresenta il file descriptor nel contesto di un pipe?
Signup and view all the answers
Qual è la funzione di un pipe in un sistema operativo?
Qual è la funzione di un pipe in un sistema operativo?
Signup and view all the answers
Quale dei seguenti comportamenti è tipico di una nonblocking operation sul semaforo?
Quale dei seguenti comportamenti è tipico di una nonblocking operation sul semaforo?
Signup and view all the answers
Quando i processi sono collegati tramite un pipe, quale processo ha il write end del pipe?
Quando i processi sono collegati tramite un pipe, quale processo ha il write end del pipe?
Signup and view all the answers
Quale parte di un comando shell è collegata a stdout nel contesto di un pipe?
Quale parte di un comando shell è collegata a stdout nel contesto di un pipe?
Signup and view all the answers
Study Notes
Introduzione al Laboratorio di Sistemi Operativi
- Il laboratorio si concentra su sistemi operativi, introducendo l'IPC (Inter-Process Communication) tramite pipe e FIFO.
- Il docente è Daniele Radicioni.
Argomenti del Laboratorio UNIX
- Introduzione a UNIX
- Integrazione C: operatori bitwise, precedenze, preprocessore, pacchetto di codice, compilazione condizionale e utility make.
- Controllo dei processi
- Segnali
- Pipe e FIFO
- Code di messaggi
- Memoria condivisa
- Semafori
- Introduzione alla programmazione bash
Credits
- Il materiale è principalmente tratto da testi come "The Linux Programming Interface" di Michael Kerrisk e "Advanced Programming in the UNIX® Environment" di W. Richard Stevens e Stephen A. Rago.
IPC Facilities
- Gli strumenti UNIX per comunicazione e sincronizzazione sono divisi in tre categorie funzionali:
- Comunicazione: faciliti lo scambio di dati tra processi.
- Sincronizzazione: faciliti la sincronizzazione delle azioni dei processi.
- Segnali: sebbene originariamente non progettati per la sincronizzazione, in alcune situazioni possono svolgere questo ruolo.
Data-transfer facilities
- Byte stream: i dati scambiati (pipe, FIFO, datagram socket) sono considerati come un flusso di byte. Ogni operazione di lettura può leggere un numero arbitrario di byte. Questo modello riflette il modo tradizionale in cui i file sono rappresentati in UNIX.
- Messaggi: i dati scambiati (code di messaggi, socket) sono sotto forma di messaggi delimitati. Ogni operazione di lettura legge un intero messaggio e non è possibile leggere parzialmente un messaggio o più messaggi in una sola operazione.
Memoria Condivisa
- Permette ai processi di scambiarsi informazioni mettendole in una regione di memoria condivisa.
- E' uno strumento veloce per la comunicazione, in quanto non richiede chiamate di sistema per i trasferimenti utente-kernel.
Semafori
- Un semaforo è un intero mantenuto dal kernel il cui valore non può essere minore di 0.
- I processi possono decrementare o incrementare il valore di un semaforo.
- Se un tentativo di decremento porta un valore sotto 0, il kernel blocca l'operazione fino a che il valore del semaforo non aumenta nuovamente.
- In alternativa è possibile richiedere un'operazione senza blocco (non-blocking), che restituisce un errore se l'operazione non può essere eseguita.
Pipe
- Le pipe offrono una soluzione al problema di far sì che l'output di un processo sia utilizzato come input di un altro.
- I FIFO sono una variazione dei pipe, che consentono la comunicazione tra processi qualsiasi.
Pipes
- Per eseguire comandi come
ls -al | wc -l
, la shell crea due processi (uno perls
e uno perwc
). - L'output di
ls
(fd=1) è connesso all'input diwc
(fd=0) tramite il pipe. - I processi non sono a conoscenza della pipe; leggono/scrivono da/su descrittori di file standard.
I pipe sono stream di byte
- Un pipe è un flusso di byte. Non si fa riferimento a un concetto di messaggio o delimitazione.
- Il processo di lettura può leggere blocchi di qualsiasi dimensione, ignorando le dimensioni dei blocchi scritti dal processo di scrittura.
- I dati passano in sequenza, e non è possibile accedere ai dati in modo non sequenziale tramite Iseek().
Lettura da pipe
- I tentativi di lettura su un pipe vuoto rimangono bloccati fino a quando non viene scritto almeno un byte nel pipe.
- Quando la fine della scrittura (write end) è chiusa, il processo di lettura riceve un end-of-file (EOF) codice.
- I pipe sono unidirezionali; i dati possono viaggiare solo in una direzione.
Capacità limitata
- I pipe sono buffer in memoria con capacità massima.
- Se il buffer è pieno, le scritture successive si bloccano fino a che il buffer non viene svuotato dal processo di lettura.
- Le applicazioni non hanno bisogno di conoscere la capacità del buffer.
La funzione pipe()
- La chiamata di sistema
pipe()
crea un nuovo pipe e fornisce due file descriptor: uno per la lettura (filedes[0]) e uno per la scrittura (filedes[1]).
Comunicazione tra processi non imparentati
- I pipe possono essere utilizzati per la comunicazione fra processi non imparentati (ad es., client e server) utilizzando FIFO.
- I FIFO hanno un nome nel file system e sono aperti come file.
- Ciò consentirà comunicazioni tra tutti i processi.
Chiusura descrittori
- I descrittori di file inutilizzati devono essere chiusi per evitare comportamenti errati o blocchi.
FIFO
- I FIFO sono simili ai pipe, ma hanno un nome nel file system.
- Possono essere utilizzati per la comunicazione tra processi non imparentati.
Utilizzo di FIFO
- Quando un FIFO è aperto, è possibile usare le system call
read()
ewrite()
come con i pipe. - I dati vengono letti nello stesso ordine in cui sono stati scritti.
Creazione di FIFO
- La funzione
mkfifo()
crea un nuovo FIFO specificato dal path e da un mode (permessi).
Sincronizzazione con FIFO
- L'apertura di un FIFO in modalità lettura blocca fino a quando non è aperto un FIFO in modalità scrittura.
- L'apertura di un FIFO in modalità scrittura blocca fino a quando non è aperto un FIFO in modalità lettura.
Application client-server
- Il server assegna numeri sequenziali univoci ai client.
- I client inviano le richieste al server usando un singolo FIFO server.
- Il nome del FIFO server è definito nel file di intestazione del protocollo.
Protocolli
- I dati in pipe e FIFO sono stream di byte, i confini tra i multipli messaggi non sono preservati.
- Il mittente e il ricevitore devono accordarsi su una convenzione per separare i messaggi.
- Questo può essere un carattere delimitatore (es. newline).
Server
- Crea il proprio well-known FIFO.
- Apre il FIFO in modalità lettura finché un client non lo apre in scrittura.
- Apre il FIFO in modalità scrittura (senza bloccare).
- Crea un ciclo che legge e risponde alle richieste dei client.
- Costruisce, tramite il nome client FIFO, il path del cliente ed apre il FIFO per la risposta.
- Abbandona la richiesta del client se c'è un errore durante l'apertura del FIFO.
Client
- Crea un FIFO.
- Costruisce un messaggio contenente l'ID del processo client e la lunghezza della sequenza desiderata.
- Apre il FIFO server e invia il messaggio.
- Apre il proprio FIFO e legge e stampa la risposta del server.
Esempio di utilizzo su shell
- Viene mostrato un esempio di utilizzo di comandi unix su shell per dimostrare come i FIFO vengono utilizzati con i pipe.
Studying That Suits You
Use AI to generate personalized quizzes and flashcards to suit your learning preferences.
Related Documents
Description
Questo laboratorio esplora i sistemi operativi, in particolare l'IPC attraverso pipe e FIFO. Gli studenti impareranno a gestire l'integrazione C e a controllare i processi in ambiente UNIX. Il corso utilizzerà testi di riferimento autorevoli per fornire una base solida nella programmazione di sistemi operativi.