Laboratorio di Sistemi Operativi



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

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

IPC System V. Code di messaggi

ESERCIZI DI PROGRAMMAZIONE C IN AMBIENTE UNIX

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

I/O su Socket TCP: read()

Esercitazione [8] Pipe e FIFO

Gestione dei File in C

Files, File I/O, File Sharing. Franco Maria Nardini

Esercizio 2. Client e server comunicano attraverso socket TCP

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

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

Funzioni in C. Violetta Lonati

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

Thread: sincronizzazione Esercitazioni del 09 Ottobre 2009

Sistemi Operativi Esercizi Sincronizzazione

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Funzioni matlab per la gestione dei file. Informatica B Prof. Morzenti

Matlab: Gestione avanzata dei file

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni server

Laboratorio di Sistemi Operativi

Manuale Terminal Manager 2.0

Guida Rapida all uso del License Manager di ROCKEY4Smart (V )

Corso di Sistemi Operativi Ingegneria Elettronica e Informatica prof. Rocco Aversa. Raccolta prove scritte. Prova scritta

Introduzione al Linguaggio C

Guida per la registrazione alla piattaforma di Gestione dei Corsi per il Consulente Tecnico Telematico

CERTIFICATI DIGITALI. Manuale Utente

Esercizio sulla gestione di file in Unix

MANUALE D'USO DEL PROGRAMMA IMMOBIPHONE

Esempio produttori consumatori. Primitive asincrone

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

BOZZA. cin per la comunicazione dal dispositivo di input standard, la tastiera, al programma (stream di input standard)

FPf per Windows 3.1. Guida all uso

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

B R E V E G U I D A ( V I S I S L A B C O F F E E ) Breve guida page 1

IMPORT EXPORT CONTABILITA GENERALE

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Installazione del software Fiery per Windows e Macintosh

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

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

Istruzioni per l installazione del software per gli esami ICoNExam (Aggiornate al 15/01/2014)

GUARINI PATRIMONIO CULTURALE VERSIONE MSDE/SQL SERVER MANUALE DI INSTALLAZIONE GUARINI PATRIMONIO CULTURALE VERSIONE MSDE/SQL SERVER

Indice GAMMA. Guida utente

COME CONFIGURARE UN CLIENT DI POSTA

Configurazione di una connessione DUN USB

puntatori Lab. Calc. AA 2007/08 1

Istruzioni per creare un file PDF/A tramite software PDFCreator

ISTITUTO TECNICO INDUSTRIALE STATALE LA GESTIONE DEI FILE DI TESTO IN C++

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

MODULO 02. Iniziamo a usare il computer

Manuale per l auto registrazione e l invio della documentazione. Qualifica Fornitori QUALIFICA FORNITORI AUTO REGISTRAZIONE INVIO DELLA DOCUMENTAZIONE

developed by Emanuele De Carlo

Sistemi Operativi (modulo di Informatica II)

IBM Lotus Notes Guida per utenti

POSTA ELETTRONICA Per ricevere ed inviare posta occorrono:

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Funzioni. Il modello console. Interfaccia in modalità console

Printer Driver. Questa guida descrive l installazione dei driver stampante per Windows Vista e Windows XP.

Questo è riservato all Organizzazione Nazionale per la sistemazione delle parrocchie negli alberghi e per controlli contributi

COMUNICAZIONE UTENTI SISTEMI-PROFIS INSTALLAZIONE GE.RI.CO e PARAMETRI2015

Inter Process Communication. Laboratorio Software C. Brandolese

Introduzione alla programmazione in C

La selezione binaria

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

GRUPPO CAMBIELLI. Posta elettronica (Webmail) Consigli di utilizzo

Introduzione alla Programmazione Orientata agli Oggetti. Classi, Oggetti e Messaggi

Manuale del Docente - Scienze Politiche

Allocazione dinamica della memoria - riepilogo

2.7 La cartella Preparazioni e CD Quiz Casa

Manuale Utente PEC e Client di Posta tradizionale

Elementi di Architettura e Sistemi Operativi

La posta elettronica

Passaggio dati tra FileMaker Go su ipad e rete locale. Giuseppe Pupita Membro FBA Certified FileMaker Developer 7, 8, 9 e 10

DI D AGRA R MM M I M A BLOCC C H C I TEORI R A E D D E SERC R I C ZI 1 1

SCARICO DATI ONETOUCH Verio per EuroTouch Home GUIDA ALL USO

Aggiornamento programma da INTERNET

Gestione dei File. dischi nastri cd

Gestione del processore e dei processi

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

L archiviazione della posta elettronica può aiutarci a recuperare spazio senza costringerci a cestinare documenti importanti

Transcript:

Le FIFO pipe vs fifo la pipe può essere usata solo tra processi "imparentati" (che hanno un antenato comune che ha creato la pipe) la fifo consente di scambiare dati tra processi qualsiasi 2 1

FIFO (named pipes) #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode); Restituisce: 0 se OK -1 in caso di errore 3 Apertura di un FIFO Creare una FIFO è come creare un file; infatti FIFO è un tipo di file (codificato in st_mode di stat) Una volta creata, una FIFO può essere aperta con open oppure fopen (l'argomento mode è lo stesso della open e creat). Anche se somiglia ad un file (si utilizzano le stesse funzioni di I/O, risiede sul filesystem) ha le caratteristiche di una pipe: I dati scritti vengono letti in ordine first-in-first-out Le chiamate in lettura e scrittura sono atomiche se la quantità di dati è minore di PIPE_BUF Non è possibile rileggere i dati già letti né posizionarsi all interno con lseek 4 2

Sincronizzazione in una FIFO Una open in lettura si blocca fino a che un processo non effettua una open in scrittura (e viceversa). Se viene utilizzato il flag O_NONBLOCK, una open in lettura ritorna immediatamente se non c è un processo che ha effettuato una open in scrittura. una open in scrittura restituisce un errore se non c è un processo che ha effettuato una open in lettura. 5 Sincronizzazione in una FIFO Se si effettua una write su una FIFO che non e piu aperta in lettura da alcun processo, viene generato il segnale SIGPIPE Quando l ultimo degli scrittori chiude una FIFO, viene generato un EOF per il processo lettore 6 3

esempio:comunicazione da Client a Server i client mandano richieste e il server le deve leggere dalla FIFO. 7 esempio 1 i client scrivono nella FIFO del server un msg in cui si presentano e chiedono di essere uccisi il server li uccide!!! il server legge dalla FIFO 8 4

Soluzione: client #include<stdio.h> #include<unistd.h> #include<sys/stat.h> #include<sys/types.h> #include<fcntl.h> int main(){ int fds, pid; char c[5],f[9]; if((fds=open("fifo",o_wronly))<0){ //Apre la well-known FIFO printf("error: impossibile aprire la fifo in scrittura\n"); pid=getpid(); write(fds,&pid,sizeof(pid)); //Invia il messaggio al server close(fds); //Chiude la well-known FIFO while(1); //Attende di essere ucciso 9 Soluzione: server #include<stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include<fcntl.h> #include<signal.h> int done; void alrm(int s); void server(int fd); int main(){ int fds; int pidc; done=1; signal(sigalrm,alrm); alarm(30); //Il server rimarrà attivo per 30 secondi umask(0); 10 5

Soluzione: server //Crea la well-known FIFO if(mkfifo("fifo",s_irwxu S_IRGRP S_IROTH)<0){ printf("impossibile creare la FIFO\n"); while(done){ if((fds=open("fifo",o_rdonly))<0){ //Apre la well-known FIFO printf("error: impossibile aprire la FIFO in sola lettura\n"); server(fds); //Esegue le operazioni richieste close(fds); //Chiude la well-known FIFO remove("fifo"); //Rimuove la well-known FIFO 11 Soluzione : server /*Segnala il passaggio dei 30 secondi e indica al server di arrestarsi*/ void alrm(int s){ done=0; void server(int fd){ char c[5],f[9]; int pid; int fdc; if(read(fd,&pid,sizeof(pid))<0){ //Legge dalla well-known FIFO printf("error: il messaggio non è valido\n"); return; printf("il server ha letto dalla FIFO %d\n",pid); //sleep(1); kill(pid,sigkill); //Uccide il processo client 12 6

esempio:comunicazione da Client a Server...ma come puo rispondere il server? Soluzione: Ciascun client manda insieme alla sua richiesta anche il suo pid Il server crea una FIFO per ciascun client usando un nome con una parte prefissata ed una contenente il pid del processo 13 Client-Server con FIFO 14 7

esempio-2 i client scrivono nella FIFO del server un msg in cui si presentano e chiedono di essere uccisi il server legge e scrive nelle loro FIFO un BANG il client legge la risposta del server il server li uccide!!! 15 Soluzione: client #include<stdio.h> #include<unistd.h> #include<sys/stat.h> #include<sys/types.h> #include<fcntl.h> int main(){ int fds, pid; char c[5],f[9]; if((fds=open("fifo",o_wronly))<0){ //Apre la well-known FIFO printf("error: impossibile aprire la fifo in scrittura\n"); pid=getpid(); write(fds,&pid,sizeof(pid)); //Invia il messaggio al server close(fds); //Chiude la well-known FIFO 16 8

Soluzione: client sprintf(f, FIFO%d\0",pid); //Setta il nome della client-fifo //Attende finchè la client-fifo non è creata e la apre while((fds=open(f,o_rdonly))<0); if(read(fds,c,5)<0) //Legge dalla client-fifo printf("impossibile leggere BANG\n"); printf("il client ha letto %s e sta per morire\n",c); close(fds); //Chiude la client-fifo while(1); //Attende di essere ucciso 17 Soluzione: server #include<stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include<fcntl.h> #include<signal.h> int done; void alrm(int s); void server(int fd); int main(){ int fds; int pidc; done=1; signal(sigalrm,alrm); alarm(30); //Il server rimarrà attivo per 30 secondi umask(0); 18 9

Soluzione: server //Crea la well-known FIFO if(mkfifo("fifo",s_irwxu S_IRGRP S_IROTH)<0){ printf("impossibile creare la FIFO\n"); while(done){ if((fds=open("fifo",o_rdonly))<0){ //Apre la well-known FIFO printf("error: impossibile aprire la FIFO in sola lettura\n"); server(fds); //Esegue le operazioni richieste close(fds); //Chiude la well-known FIFO remove("fifo"); //Rimuove la well-known FIFO /*Segnala il passaggio dei 30 secondi e indica al server di arrestarsi*/ void alrm(int s){ done=0; 19 Soluzione : server void server(int fd){ char c[5],f[9]; int pid; int fdc; if(read(fd,&pid,sizeof(pid))<0){ //Legge dalla well-known FIFO printf("error: il messaggio non è valido\n"); return; printf("il server ha letto dalla FIFO %d\n",pid); sprintf(f, FIFO%d\0",pid); //Compone il nome della client-fifo if(mkfifo(f,s_irwxu S_IRGRP S_IROTH)<0){ //Crea la client-fifo printf("impossibile creare la FIFO\n"); return; if((fdc=open(f,o_wronly))<0){ //Apre la client-fifo printf("impossibile aprire la FIFO in scrittura\n"); return; 20 10

Soluzione : server if(write(fdc,"bang",5)<0) //Scrive nella client-fifo printf("impossibile scrivere\n"); close(fdc); //Chiude la client-fifo /*Può essere usato per far sì che il client abbia il tempo di leggere dalla FIFO*/ //sleep(1); kill(pid,sigkill); //Uccide il processo client remove(f); //Rimuove la client-fifo 21 Esercizio Sia P1 un processo che crea una pipe ed un figlio F1. Sia P2 un altro processo che comunica con P1 con una FIFO. P2 genera ogni secondo un numero tra 1 e 100 e lo scrive nella FIFO insieme al proprio PID. P1 per 20 secondi legge i numeri trovati nella FIFO e scrive sulla pipe il proprio PID più il numero letto. P1 dopo 20 sec dalla creazione del primo figlio, scrive sulla pipe il PID di P2 ed il numero -1; quindi stampa un messaggio sullo schermo e termina la sua esecuzione. F1 legge il numero dalla pipe: se esso è -1 uccide P2 e termina; altrimenti stampa sul terminale il proprio PID seguito dal numero letto dalla pipe. 22 11