Program m azione di Sistem a 5

Documenti analoghi
Comunicazione tra processi: pipe Le pipe sono un meccanismo UNIX di Inter Process Communication (IPC)

Sistemi Operativi Teledidattico

SC per Inter Process Comminication. Pipe senza nome e con nome (FIFO)

Igino Corona

Programmazione di Sistema 5. Pipe e Fifo. IPC: Inter Process Communication. Pipe anonimi e con nome (FIFO) Paolo Baldan

La Comunicazione tra Processi in Unix

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

SC per Inter Process Communication. Pipe senza nome e con nome (FIFO)

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Pipe con nome. [Pagina intenzionalmente vuota] 1: Pipe con nome ( ) slide 1:1/22 (p.1)

Laboratorio di Sistemi Operativi

Digressione: man 2...

Processi. Comunicazione tra processi Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino

I/O su Socket TCP: read()

SmallShell Piccolo processore comandi

&& (nessun altro processo ha il file aperto) && (il fd e chiuso) Cancella il file;

Chiamate di sistema per la Inter Process Communication (IPC) in POSIX. E.Mumolo, DEEI

File I/O. M. R. Guarracino: File I/O 1

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 3. 1 strace : visualizzazione delle system call invocate da un processo

Laboratorio di Sistemi Operativi

Per operare su un file abbiamo bisogno di aprirlo, scriverlo, leggerlo, chiuderlo:

Program m azione di Sistem a 6

Chiamate di sistema. Pipe Flussi di I/O

Sistemi Operativi (M. Cesati)

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 3

Capitolo 5 -- Stevens

Laboratorio di Sistemi Operativi

Esercitazione di Lab. di Sistemi Operativi 1 a.a. 2011/2012

Gestione dei processi

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Directory. Le directory unix sono file.

Il processo figlio : utilizza lo stesso codice che sta eseguendo il padre ;

Digressione: man (2)...

La sincronizzazione è legata alla implementazione delle pipe: int pipe(int fd[2]);

System calls. permettono ai programmi utente di richiedere servizi al Sistema Operativo. servizi come scrittura di file, stampa su video, ecc.

System call per la gestione di processi

I file Laboratorio di Linguaggi di Programmazione a.a. 2001/2002

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

GESTIONE DEI FILE IN C. Docente: Giorgio Giacinto AA 2008/2009

Scrivere alla fine di un file Vi sono due modi per scrivere alla fine di un file:

Introduzione ai socket

Controllo dei Processi 1

Comandi. Sistema Operativo

File binari e file di testo

Gestione dei file. Stefano Ferrari. Università degli Studi di Milano Programmazione. anno accademico

Il File-System. I file in ambiente Linux Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Processi in UNIX. Spazio di sistema (residente) Tabella dei. file APERTI OPEN FILE. Tabella dei codici

Lab. di Sistemi Operativi - Esercitazione n 9- -Thread-

Lab. di Sistemi Operativi - Esercitazione n 7- -Gestione dei processi Unix-

Laboratorio di Sistemi Operativi Marzo-Giugno 2008 matricole congrue 0 mod 3

Corso di Laboratorio di Sistemi Operativi

Programmazione di Sistema 3

Programmazione di sistema in UNIX. Immagine di un processo in UNIX. Area dati. File comandi utente

Corso di Programmazione Concorrente Processi. Valter Crescenzi

Sommario. Manipolazione sequenziale di file in C Funzioni di base per I/O di file

Program m azione di Sistem a 3

Addendum alle chiamate di sistema per la gestione processi. E Mumolo

LABORATORIO di Reti di Calcolatori

Operazioni su file di caratteri

Esercitazione [5] Input/Output su Socket

INTERPROCESS COMMUNICATION 27

Scrivere alla fine di un file Vi sono due modi per scrivere alla fine di un file:

Introduzione. P4 termina prima di P3, P2 e P3 prima di P1 P1 P2 P3 P4 P1 P1 P2 P3 P4. Padre. P1,..., P4 sono processi. Figlio

Input/Output. Lettura e scrittura Caratteri e Stringhe: Terminale e file. Input/output. caratteri stringhe formattato ascii binari

Crea un nuovo processo. Al processo padre ritorna il PID del figlio. Al processo figlio ritorna 0

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

I files in C. A cura del prof. Ghezzi

Processi Concetti di base. Esecuzione parallela e sequenziale Il concetto di processo Gestione dei processi

AXO. Operativo. Architetture dei Calcolatori e Sistema. programmazione di sistema

ESERCIZI DI PROGRAMMAZIONE C IN AMBIENTE UNIX

IPC System V. Code di messaggi

Sistemi operativi Modulo II I semafori 2 Select

I SISTEMI OPERATIVI (1)

CREAZIONE DI UN FILE

Programmazione di sistema in Linux: gestione dei file. E. Mumolo

eseguire comandi dati dall'utente, utilizzando una macchina reale, di livello inferiore,

Laboratorio di Sistemi Operativi primavera 2009

Sulla libreria standard, III. Manipolare file con stdio.h

Corso di Sistemi Operativi Programmazione di Sistema e Concorrente

Argomenti della lezione. Messaggi. Formato di un messaggio. Corso di Sistemi Operativi Programmazione di Sistema e Concorrente

Principles of Concurrent Programming

file fisico file logico

Introduzione al C. Stream e disk file

I File. Il file e` l'unita` logica di memorizzazione dei dati su memoria di massa.

Sincronizzazione e comunicazione tra processi in Unix. usati per trasferire ad un processo l indicazione che un determinato evento si è verificato.

Introduzione ai Device Drivers in Linux. E.Mumolo, DEEI

Corso sul linguaggio Java

Processi UNIX. I Processi nel SO UNIX. Gerarchie di processi UNIX. Modello di processo in UNIX

File e Directory. M. Guarracino - File e Directory 1

Concetto di Processo Scheduling dei Processi Operazioni sui Processi Processi cooperanti Comunicazione tra processi

Chiamate di sistema per la Gestione dei processi in POSIX. E.Mumolo, DEEI

Librerie C. Corso di Linguaggi e Traduttori 1 AA Corso di Linguaggi e Traduttori 1 AA stdio.h

Corso di Sistemi Operativi Esercitazioni

Processi. Introduzione. Effective user/group id. Fork

Sistemi Operativi T. Esercizi

I Processi nel SO UNIX

In generale può essere utile che i due processi eseguano del codice diverso

Esercitazione [8] Pipe e FIFO

UNIX file system: organizzazione logica. Il File System di UNIX. UNIX file system: organizzazione fisica

Transcript:

Program m azione di Sistem a 5 Lucidi per il corso di Laboratorio di Sistemi Operativi tenuto da Paolo Baldan presso l'università Ca' Foscari di Venezia, anno accademico 2004/ 2005. Parte di questo materiale è rielaborato dai lucidi del Corso di Laboratorio di Sistemi Operativi tenuto da Rosario Pugliese presso l'università di Firenze, anno accademico 2001/ 02.

IPC: Inter Process Com m unication Meccanismi che permettono a processi distinti di com unicare e scam biare inform azioni. I processi che com unicano possono risiedere sulla stessa macchina (segnali, pipe, fifo, socket) su macchine diverse (socket) La com unicazione può essere finalizzat a a cooperazione: i processi scambiano dati per l'ottenimento di un fine comune. sincronizzazione: lo scambio di informazioni permette a processi indipendenti, ma correlati, di schedulare correttamente la propria attività (es. di non accedere cont em poraneam ent e ad una risorsa condivisa). 2

Pipe e Fifo

Pipe anonim i e con nom e (FIFO) Meccanismo utilizzato frequentem ente da una shell per connettere l'output di un comando all'input di un alt ro (pipeline). $ who sort I due processi connessi da un pipe sono eseguiti concorrentemente. Un pipe memorizza automaticamente l'output dello scrittore (who) in un buffer. Se il buffer è pieno, lo scrittore si sospende fino a che alcuni dati non vengono letti. Se il buffer è vuoto, il lettore (sort) si sospende fino a che diventano disponibili dei dati in output. 4

Pipe con nom e e anonim i (FIFO) Pipe Anonim i Presenti in tutte le versioni di UNIX utilizzati, ad es., dalle shell per le pipeline. Pipe con nome o FIFO Presenti in UNIX System. 5

Pipe anonim i Un pipe anonim o è un canale di com unicazione che unisce due processi (creat o con pipe()) unidirezionale permette la com unicazione solo tra processi con un antenato comune Memorizza il suo input in un buffer (la massim a dim ensione varia, ma è tipicamente intorno ai 5K) Un pipe presenta due lati di accesso (in/out), ciascuno associato ad un descrittore di file il lato di scrittura è acceduto invocando write() il lato di lettura è acceduto invocando read(). Quando un processo ha finito di usare un (lato di un) pipe chiude il descrittore con close(). 6

Pipe anonim i: pipe() int pipe (int fd[2]) crea un pipe anonimo e restituisce due file descriptor lato di lettura fd[0] (aperto in lettura) lato di scrittura fd[1] (aperto in scrittura) fd[0] fd[1] Processo p ip e Kern el Fallisce restituendo -1 se il kernel non ha più spazio per un nuovo pipe; altrim enti restituisce 0. 7

Pipe anonim i: lettura Se un processo legge da un pipe se il lato scrittura è stato chiuso, read() restituisce 0 che indica la fine dell'input; se il pipe è vuoto e il lato di scrittura è ancora aperto, si sospende fino a che diventa disponibile qualche input; se il processo tenta di leggere più byte di quelli presenti nel buffer associato, i byte disponibili vengono letti e read() restituisce il num ero dei byte effettivam. letti. 8

Pipe anonim i: scrittura Se un processo scrive su di un pipe se il lato di lettura è stato chiuso, write() fallisce ed allo scrittore è inviato un segnale SIGPIPE, la cui azione di default è di far terminare il ricevente; se scrive meno byte di quelli che un pipe può contenere, write() viene eseguita in modo atomico (non possono avvenire interleaving dei dati scritti da processi diversi sullo st esso pipe); se scrive più byte di quelli che un pipe può contenere (PIPE_BUF), non c'è garanzia di atomicità. lseek() non ha senso se applicata ad un pipe. Dato che l'accesso ad un pipe anonimo avviene tramite file descriptor, solo il processo creatore ed i suoi discendent i possono accedere al pipe. 9

Pipe anonim i: pipe() La tipica sequenza di eventi è il processo crea un pipe anonim o (pipe()); il processo crea un figlio (fork()); lo scrittore chiude il suo lato di lettura del pipe ed il lettore chiude il suo lato scrittura (close()); i processi com unicano usando write() e read(); ogni processo chiude (close()) il suo descrittore quando ha finito. Una comunicazione bidirezionale si può realizzare ut ilizzando due pipe. 10

Esem pio: talk.c (scam bio di m essaggio) Il programma talk.c usa un pipe per perm ettere al padre di leggere un m essaggio inviato dal figlio. L'inclusione del carattere NULL permette al lettore di determinare la fine del messaggio. 11

Esem pio: talk.c (scam bio di m essaggio) #include <stdio.h> #define READ 0 /* The index of the read end of the pipe */ #define WRITE 1 /* The index of the write end of the pipe */ char *phrase = "Stuff this in your pipe"; int main (void) { int fd [2], bytesread; char message [100]; /* Parent process' message buffer */ pipe (fd); /* Create an unnamed pipe */ if (fork () == 0) { /* Child, writer */ close(fd[read]); /* Close unused end */ write (fd[write], phrase, strlen (phrase) + 1); /* include \0 */ close (fd[write]); /* Close used end */ } else { /* Parent, reader*/ close (fd[write]); /* Close unused end */ bytesread = read (fd[read], message, 100); printf ("Read %d bytes: %s\n", bytesread, message); close (fd[read]); /* Close used end */ } } 12

Esem pio: talk.c (scam bio di m essaggio) Esem pio di esecuzione... $./talk Read 24 bytes: Stuff this in your pipe $ 13

Com unicazione tram ite pipe (e non solo) Quando un processo scrittore invia messaggi di lunghezza variabile tramite un pipe, occorre fissare un protocollo di comunicazione che perm etta al processo lettore di individuare la fine di ogni singolo messaggio. Alcune possibilit à sono inviare la lunghezza del messaggio (dato di dimensione fissa e nota) prima del messaggio stesso; terminare un messaggio con un carattere speciale come NULL o un newline. Più in generale, il protocollo stabilisce la sequenza di messaggi attesa delle due parti. 14

Esem pio: connect.c (ridirezione con pipe) Il programma connect.c esegue due programmi e connette l'output di uno all'input dell'altro. I nom i dei program mi sono passati come argomenti e si assume che nessuno dei due program mi sia invocato con argomenti. 15

Esem pio: connect.c (ridirezione con pipe) #include <stdio.h> #define READ 0 #define WRITE 1 /* connect cmd1 cmd2 redirige lo stdout di cmd1 sullo stdin di cmd2 */ int main (int argc, char *argv []) { int fd [2]; pipe (fd); /* Create an unamed pipe */ if (fork ()!= 0) { /* Parent, writer */ close (fd[read]); /* Close unused end */ dup2 (fd[write], 1); /* Duplicate used end to stdout */ close (fd[write]); /* Close original used end */ execlp (argv[1], argv[1], NULL); /* Execute writer program */ perror ("connect"); /* Should never execute */ } else { /* Child, reader */ close (fd[write]); /* Close unused end */ dup2 (fd[read], 0); /* Duplicate used end to stdin */ close (fd[read]); /* Close original used end */ execlp (argv[2], argv[2], NULL); /* Execute reader program */ perror ("connect"); /* Should never execute */ } } 16

Pipe con nom e (FIFO) I pipe con nom e, o FIFO, sono più flessibili di quelli anonimi ed offrono i seguenti vantaggi esistono come file speciali nel file system; il loro uso non è lim itato a processi con antenati com uni; un pipe con nom e può essere usato da qualunque processo che conosca il nom e del file corrispondente. esistono fino a che non sono esplicitamente rimossi; hanno capacità di buffer fino a 40K (macro PIPE_BUF in limits.h); tuttavia, sono supportati solo da varianti del System V. Sono file speciali e possono essere creati usando l'utility UNIX mknod; usando la system call mknod(). 17

Utility m knod mknod [-m mode] name p Permette al superuser di creare vari tipi di file speciali. La sintassi specificata consente ad un utente qualsiasi di creare un file speciale di tipo pipe con nom e (opzione p) individuato dal nome name. I diritti di accesso ad un pipe sono assegnati contestualmente alla creazione con l'opzione -m, dove mode specifica i diritti in ottale; successivamente alla creazione con il comando chmod, come per i file regolari. Un comando equivalente è mkfifo [-m mode] name. 18

Nam ed pipe (esem pio) Un analogo del comando ls more può essere realizzato creando una pipe, su cui ls scrive e more legge... Il comando ls appena lanciato si blocca poiché apre in scrittura una pipe priva di lettori... $ mknod -m 0660 prova p $ ls -l prov* prw-rw---- 1 rossi users 0 May 28 10:35 prova $ ls -l > prova & [3] 827 $ more < prova total 22 -rwxr-xr-x 1 baldan users 4230 May 22 2000 background... -rwxr-xr-x 1 baldan users 4591 May 29 2000 writer -rw-r--r-- 1 baldan users 669 May 29 2000 writer.c [1]+ Done ls -l > prova $ 19

System call m knod() int mknod (const char *path, mode_t mode, dev_t dev) Permette a un superuser di creare un nodo del file system (file regolare, file speciale di dispositivo, pipe con nome). Restituisce 0 se ha successo; -1 altrim enti. 20

System call m knod() Un utente generico può invocare mknod() solo per creare un pipe con nome. In questo caso pathname è il nom e di file che identifica il pipe con nome; mode specifica i diritti di accesso ed il tipo di file da creare, combinati tram ite. In pratica S_IFIFO diritti dove il flag S_IFIFO indica che il nodo da creare è un pipe con nome. dev è un parametro che viene ignorato nel caso dei pipe con nome, e quindi posto a 0. 21

System call m knod() I permessi sono modificati da umask nel solito modo: i permessi effettivi del file creato sono mode & ~ umask. Un funzione di libreria che permette di ottenere lo stesso risultato è int mkfifo (const char *path, mode_t mode) 22

Pipe con nom e: open() int open (const char *pathname, int flags) Per i FIFO, i parametri tipici di open() sono pathname: il nome del pipe che si vuole aprire (se non esiste, si ottiene l'errore E_NOENT); flags: indicano il tipo di accesso al pipe O_RDONLY: sola let t ura; O_WRONLY: sola scrit t ura; O_NONBLOCK: apertura in m odalità non bloccante. Restituisce un descrittore di file, se ha successo; -1 altrimenti. 23

Pipe con nom e: open() Comportam ento bloccante Normalm ente, l'apertura di un FIFO in lettura blocca il processo fino a che il FIFO non viene aperto anche in scrit t ura, e viceversa. Con il flag O_NONBLOCK l'apertura in sola lettura avrà successo anche se il FIFO non è stato ancora aperto in scrittura l'apertura in sola scrittura fallirà (con errore ENXIO) a m eno che il lato di lettura non sia già stato aperto. I pipe con nome sono file, quindi per poterli utilizzare, diversam ente dai pipe anonimi, vanno prima aperti. 24

Pipe con nom e: read() ssize_t read (int fd, void *buf, size_t count) La lettura da un pipe con nome avviene come per i file regolari. Normalmente... read() è bloccante: il processo è sospeso fino a che divengono disponibili i byt e richiest i. Se è stato specificato O_NONBLOCK Se non ci sono sufficienti byte da leggere read() restituisce il num ero di caratteri letti segnala l'errore EAGAIN. 25

Pipe con nom e: write() ssize_t write (int fd, const void *buf, size_t count) La scrittura su un pipe con nom e avviene come per i file regolari. La scrittura su di un FIFO il cui lato di lettura è chiuso fallisce ed il processo riceve un segnale SIGPIPE. 26

Pipe con nom e: close() e unlink() int close (int fd) Un volta terminate le operazioni su di un pipe con nom e, il suo descrittore fd viene chiuso con close() (com e per i file regolari). int unlink (const char *filename) Come per i file regolari, unlink() rimuove il link hard da filename al file relativo. Se filename è l'ultim o link al file, anche le risorse del file sono deallocate. 27

Pipe con nom e: esem pio L'esempio si compone di un processo lettore e due processi scrittori. reader.c crea un pipe con nome apipe e lo apre in lettura; quindi legge e stampa sullo schermo delle linee che terminano con 0 fino a che il pipe è chiuso da tutti i processi scrittori. writer.c apre in scrittura apipe e scrive tre messaggi; quindi chiude il pipe e termina. Se quando writer.c tenta di aprire apipe il file non esiste, writer.c ci riprova dopo un secondo fin quando non ha successo. Il lettore attende di leggere fino a che un processo qualsiasi non ha aperto il FIFO, legge quello che di volta in volta viene scritto e capisce che non c'è più niente da leggere quando legge EOF. A questo punto il lettore chiude il suo descrittore e rimuove il FIFO. 28

reader.c #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> /* For S_IFIFO */ #include <fcntl.h> int readline (int fd, char *str) { /* Read a single '\0'-terminated line into str from fd */ /* Return 0 when the end-of-input is reached and 1 otherwise */ int n; do { /* Read characters until '\0' or end-of-input */ n = read (fd, str, 1); /* Read one character */ } while (n > 0 && *str++!= '\0'); return (n > 0); /* Return false if end-of-input */ } 29

reader.c int main (void) { int fd; char str[100]; unlink("apipe"); /* Remove named pipe if it already exists */ mknod ("apipe", S_IFIFO, 0); /* Create named pipe */ chmod ("apipe", 0660); /* Change its permissions */ fd = open ("apipe", O_RDONLY); /* Open it for reading */ while (readline (fd, str)) /* Display received messages */ printf ("%s\n", str); close (fd); /* Close pipe */ unlink("apipe"); /* Remove used pipe */ } 30

writ er.c #include <stdio.h> #include <fcntl.h> int main (void) { int fd, messagelen, i; char message [100]; /* Prepare message */ sprintf (message, "Hello from PID %d", getpid ()); messagelen = strlen (message) + 1; do { /* Keep trying to open the file until successful */ fd = open ("apipe", O_WRONLY); /* Open named pipe for writing */ } while (fd == -1); for (i = 1; i <= 3; i++) { /* Send three messages */ write (fd, message, messagelen); /* Write message down pipe */ sleep (3); /* Pause a while */ } close (fd); /* Close pipe descriptor */ return 0; } 31

Pipe con nom e: esem pio Esem pio di esecuzione... $ reader & writer & writer & [5] 1268 [6] 1269 [7] 1270 $ Hello from PID 1269 Hello from PID 1270 Hello from PID 1269 Hello from PID 1270 Hello from PID 1269 Hello from PID 1270 <return> [5] Done reader [6]- Done writer [7]+ Done writer $ 32