Podcast
Questions and Answers
Cosa restituisce la funzione mkfifo() in caso di successo?
Cosa restituisce la funzione mkfifo() in caso di successo?
- NULL
- 1
- 0 (correct)
- -1
Quale tra questi non è un permesso specificato per il nuovo FIFO?
Quale tra questi non è un permesso specificato per il nuovo FIFO?
- S_IWOTH (correct)
- S_IWUSR
- S_IXGRP
- S_IROTH
Qual è il significato di S_ISUID nel contesto dei permessi dei file?
Qual è il significato di S_ISUID nel contesto dei permessi dei file?
- User-execute
- Group-write
- Set-user-ID (correct)
- Sticky bit
Come viene specificato il mode per i permessi del nuovo FIFO?
Come viene specificato il mode per i permessi del nuovo FIFO?
Qual è il valore ottale di S_IRUSR?
Qual è il valore ottale di S_IRUSR?
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?
Qual è l'importanza della sincronizzazione nella memoria condivisa?
Qual è l'importanza della sincronizzazione nella memoria condivisa?
Quale strumento è frequentemente utilizzato per la sincronizzazione nella memoria condivisa?
Quale strumento è frequentemente utilizzato per la sincronizzazione nella memoria condivisa?
Quale affermazione è vera riguardo alla memoria condivisa?
Quale affermazione è vera riguardo alla memoria condivisa?
Cosa si intende generalmente con il termine 'interprocess communication' (IPC)?
Cosa si intende generalmente con il termine 'interprocess communication' (IPC)?
Qual è la principale funzione di un FIFO nei processi?
Qual è la principale funzione di un FIFO nei processi?
Cosa accade quando un processo apre un FIFO in modalità lettura?
Cosa accade quando un processo apre un FIFO in modalità lettura?
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?
Cosa accade se l'altra estremità di un FIFO è già aperta?
Cosa accade se l'altra estremità di un FIFO è già aperta?
Quale affermazione riguardo ai flag di apertura di un FIFO è corretta?
Quale affermazione riguardo ai flag di apertura di un FIFO è corretta?
Qual è la funzione di popen() nel contesto di un sistema operativo?
Qual è la funzione di popen() nel contesto di un sistema operativo?
Cosa viene restituito dalla funzione pclose() in caso di successo?
Cosa viene restituito dalla funzione pclose() in caso di successo?
Quale dei seguenti è un aspetto negativo dell'utilizzo della funzione popen()?
Quale dei seguenti è un aspetto negativo dell'utilizzo della funzione popen()?
Quale è il corretto utilizzo della funzione popen()?
Quale è il corretto utilizzo della funzione popen()?
Qual è la principale differenza tra un FIFO e un pipe?
Qual è la principale differenza tra un FIFO e un pipe?
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()?
Quale valore indica che si è verificato un errore nella funzione pclose()?
Quale valore indica che si è verificato un errore nella funzione pclose()?
Cosa fa il comando 'ls' passato a popen() nel codice fornito?
Cosa fa il comando 'ls' passato a popen() nel codice fornito?
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?
Come viene costruito il nome della FIFO per ciascun client?
Come viene costruito il nome della FIFO per ciascun client?
Quale delle seguenti affermazioni è vera riguardo i dati in pipe e FIFO?
Quale delle seguenti affermazioni è vera riguardo i dati in pipe e FIFO?
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?
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?
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?
Quale approccio può essere utilizzato per separare i messaggi in una FIFO?
Quale approccio può essere utilizzato per separare i messaggi in una FIFO?
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?
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?
Qual è la principale differenza tra un pipe e un FIFO?
Qual è la principale differenza tra un pipe e un FIFO?
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?
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?
Quale comando permette di contare il numero di file in una directory?
Quale comando permette di contare il numero di file in una directory?
Cosa rappresenta il file descriptor nel contesto di un pipe?
Cosa rappresenta il file descriptor nel contesto di un pipe?
Qual è la funzione di un pipe in un sistema operativo?
Qual è la funzione di un pipe in un sistema operativo?
Quale dei seguenti comportamenti è tipico di una nonblocking operation sul semaforo?
Quale dei seguenti comportamenti è tipico di una nonblocking operation sul semaforo?
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?
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?
Flashcards
Memoria condivisa
Memoria condivisa
Un meccanismo di comunicazione tra processi che condividono lo stesso segmento di memoria.
Sincronizzazione memoria condivisa
Sincronizzazione memoria condivisa
È necessaria per evitare che i processi accedano o modifichino dati in modo concorrente, causando errori.
Semaforo
Semaforo
Uno strumento di sincronizzazione usato per gestire l'accesso alla memoria condivisa.
Comunicazione tra processi(IPC)
Comunicazione tra processi(IPC)
Signup and view all the flashcards
Blocco lettura
Blocco lettura
Signup and view all the flashcards
Decrement del semaforo sotto 0
Decrement del semaforo sotto 0
Signup and view all the flashcards
Operazione non-blocking
Operazione non-blocking
Signup and view all the flashcards
Pipe
Pipe
Signup and view all the flashcards
FIFO
FIFO
Signup and view all the flashcards
Shell
Shell
Signup and view all the flashcards
Fork()
Fork()
Signup and view all the flashcards
Exec()
Exec()
Signup and view all the flashcards
Standard Output (stdout)
Standard Output (stdout)
Signup and view all the flashcards
Standard Input (stdin)
Standard Input (stdin)
Signup and view all the flashcards
popen()
popen()
Signup and view all the flashcards
pclose()
pclose()
Signup and view all the flashcards
fp = popen("cmdstring", "r")
fp = popen("cmdstring", "r")
Signup and view all the flashcards
fp = popen("cmdstring", "w")
fp = popen("cmdstring", "w")
Signup and view all the flashcards
Vantaggi popen()
Vantaggi popen()
Signup and view all the flashcards
Svantaggi popen()
Svantaggi popen()
Signup and view all the flashcards
Utilizzo popen() in programmi privilegiati
Utilizzo popen() in programmi privilegiati
Signup and view all the flashcards
Esempio di utilizzo di popen() e pclose()
Esempio di utilizzo di popen() e pclose()
Signup and view all the flashcards
mkfifo()
mkfifo()
Signup and view all the flashcards
Cosa sono le costanti S_IRUSR, S_IWUSR, S_IXUSR?
Cosa sono le costanti S_IRUSR, S_IWUSR, S_IXUSR?
Signup and view all the flashcards
Come si impostano i permessi del FIFO?
Come si impostano i permessi del FIFO?
Signup and view all the flashcards
Cosa significa un valore di ritorno pari a 0 per la funzione mkfifo()?
Cosa significa un valore di ritorno pari a 0 per la funzione mkfifo()?
Signup and view all the flashcards
Utilizzo FIFO per la sincronizzazione
Utilizzo FIFO per la sincronizzazione
Signup and view all the flashcards
Sincronizzazione FIFO: Apertura in lettura
Sincronizzazione FIFO: Apertura in lettura
Signup and view all the flashcards
Sincronizzazione FIFO: Apertura in scrittura
Sincronizzazione FIFO: Apertura in scrittura
Signup and view all the flashcards
Sincronizzazione FIFO: Apertura immediata
Sincronizzazione FIFO: Apertura immediata
Signup and view all the flashcards
FIFO per comunicazioni client-server
FIFO per comunicazioni client-server
Signup and view all the flashcards
Come viene identificato il FIFO del client?
Come viene identificato il FIFO del client?
Signup and view all the flashcards
Separazione dei messaggi in FIFO
Separazione dei messaggi in FIFO
Signup and view all the flashcards
Protocolli di comunicazione
Protocolli di comunicazione
Signup and view all the flashcards
Esempio: protocollo FIFO
Esempio: protocollo FIFO
Signup and view all the flashcards
Comunicazione unidirezionale FIFO
Comunicazione unidirezionale FIFO
Signup and view all the flashcards
Vantaggi dell'utilizzo dei FIFO
Vantaggi dell'utilizzo dei FIFO
Signup and view all the flashcards
Svantaggi nell'utilizzo dei FIFO
Svantaggi nell'utilizzo dei FIFO
Signup and view all the flashcards
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.