IPC System V. Code di messaggi



Documenti analoghi
Inter-Process Communication

Corso di Sistemi Operativi

I/O su Socket TCP: read()

Gestione dei processi

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

Corso di Laboratorio di Sistemi Operativi

Laboratorio di Sistemi Operativi

Interprocess Communications - II. Franco Maria Nardini

Socket TCP. seconda parte

Gestione dei File in C

Introduzione al Linguaggio C

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

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

ESERCIZI DI PROGRAMMAZIONE C IN AMBIENTE UNIX

I file di dati. Unità didattica D1 1

CREAZIONE PROCESSI IN UNIX 20

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

Esempio produttori consumatori. Primitive asincrone

Leggere un messaggio. Copyright 2009 Apogeo

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

Matlab: Gestione avanzata dei file

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

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'

Esercizio 2. Client e server comunicano attraverso socket TCP

Introduzione alla programmazione in C

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

Esempio: dest = parolagigante, lettere = PROVA dest (dopo l'invocazione di tipo pari ) = pprrlogvgante

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

(Esercizi Tratti da Temi d esame degli ordinamenti precedenti)

BARCODE. Gestione Codici a Barre. Release 4.90 Manuale Operativo

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

SISTEMI OPERATIVI 14 settembre 2015 corso A nuovo ordinamento e parte di teoria del vecchio ordinamento indirizzo SR

Esercizio 1. Esercizio 1

La struttura dati ad albero binario

2.5. L'indirizzo IP identifica il computer di origine, il numero di porta invece identifica il processo di origine.

Sistemi Operativi. Interfaccia del File System FILE SYSTEM : INTERFACCIA. Concetto di File. Metodi di Accesso. Struttura delle Directory

Che cos'è un modulo? pulsanti di opzione caselle di controllo caselle di riepilogo

Elementi di Architettura e Sistemi Operativi

Inter-Process Communication

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO V Indice

Le variabili. Olga Scotti

Laboratorio di Algoritmi e Strutture Dati

Editor vi. Editor vi

UTILIZZO DEL MODULO DATA ENTRY PER L IMPORTAZIONE DEI DOCUMENTI (CICLO PASSIVO)

Esercitazioni aggiuntive Martedì Laboratorio L-12

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

MANUALE UTENTE Fiscali Free

Struttura a record. File ad accesso diretto. Modalità di apertura. Modalità di apertura

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Esercitazione sulle libpq - libreria C per PostgreSQL

5.3 TABELLE RECORD Inserire, eliminare record in una tabella Aggiungere record Eliminare record

Esercizio sulla gestione di file in Unix

Corso di Archivistica

Le stringhe. Le stringhe

Informatica 3. LEZIONE 23: Indicizzazione. Modulo 1: Indicizzazione lineare, ISAM e ad albero Modulo 2: 2-3 trees, B-trees e B + -trees

puntatori Lab. Calc. AA 2007/08 1

Comandi di Outlook Express Messaggi in partenza Comando Comandopulsante scelta rapida

costruttori e distruttori

MICROSOFT WORD LA STAMPA UNIONE

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

Allocazione dinamica della memoria - riepilogo

System call fcntl e record locking

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

Esercitazione [5] Input/Output su Socket

ARCHIVIA PLUS - ARCHIFILE

Access. Microsoft Access. Aprire Access. Aprire Access. Aprire un database. Creare un nuovo database

CAPITOLO 7 - SCAMBIO DI MESSAGGI

Capitolo Silberschatz

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Protezione. Protezione. Protezione. Obiettivi della protezione

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

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

Lezione 6: Form 27/04/2012

Gestione delle stringhe in C

Esercitazione [8] Pipe e FIFO

Modulo 3 - Elaborazione Testi 3.5 Stampa unione

Socket TCP. prima parte

COME DEFINIRE DELLE DOWNLOAD RULES CON VPOP3

Procedura SMS. Manuale Utente

Corso di Fondamenti di Informatica

Inter Process Communication. Laboratorio Software C. Brandolese

FPf per Windows 3.1. Guida all uso

EXCEL FUNZIONI PRINCIPALI

Transcript:

IPC System V Code di messaggi

Panoramica coda di messaggi una lista concatenata di messaggi, FIFO semaforo un contatore condiviso, atomicamente modificabile memoria condivisa uno spazio di memoria accessibile da piu' processi Marco Faella 2

Panoramica Sono strutture IPC che risiedono nel kernel Sono permanenti: non vengono cancellate quando i processi terminano Sono utili i comandi ipcs e ipcrm Marco Faella 3

Identificatori Alla sua creazione, ogni struttura IPC riceve un identificatore numerico Per usare una struttura IPC, bisogna specificare il suo identificatore Come fanno processi diversi ad usare la stessa struttura IPC? Marco Faella 4

Chiavi ed identificatori I processi si trasmettono l'identificatore facile se sono parenti piu' difficile se sono indipendenti Oppure, i processi fanno generare l'identificatore a partire da una chiave condivisa la funzione ftok() (filename to key) genera una chiave a partire dal nome di un file esistente Marco Faella 5

Code di messaggi Aprire/creare una coda id msgget(key, flags) Inviare messaggio ok msgsnd(id, msg, nbytes, flags) Ricevere messaggio nbytes msgrcv(id, msg, nbytes, type, flags) Chiudere/altro ok msgctl(id, cmd, buf) Marco Faella 6

Modo 1: Creare una coda int id = msgget(ipc_private, IPC_CREAT IPC_EXCL 0666); if (id < 0) perror( msgget ), exit(1); fork();... Modo 2: #define CHIAVE /home/mfaella // Server: key_t key = ftok(chiave, 1); int id = msgget(key, IPC_CREAT IPC_EXCL 0666); // Client: key_t key = ftok(chiave, 1); int id = msgget(key, 0); Marco Faella 7

Creare o aprire una coda int msgget(key_t key, int flags); Apre la coda con chiave key Viene creata una nuova coda se: la chiave e' IPC_PRIVATE, oppure flag contiene IPC_CREAT e la chiave e' nuova Restituisce l'identificatore della coda, oppure -1 in caso di errore Marco Faella 8

Creare o aprire una coda int msgget(key_t key, int flag); Opzioni (flags), si combinano con (or bit-a-bit): IPC_CREAT: se non esiste, creala IPC_EXCL: se esiste, fallisci 0666: permessi di lettura e scrittura per tutti gli utenti Quindi, per creare una coda tra padre e figlio: msgget(ipc_private, IPC_CREAT IPC_EXCL 0666) Marco Faella 9

Coda di messaggi tra padre e figlio int id; if ( (id = msgget(ipc_private, IPC_CREAT IPC_EXCL 0666)) < 0) perror( msgget ), exit(1); if ( (pid=fork()) < 0 ) perror( fork ), exit(1); else if (pid>0) { // padre msgsnd(...);... msgctl(id, IPC_RMID, NULL); } else { // figlio msgrcv(...); } Marco Faella 10

Inviare messaggi Dichiarare una struttura apposita struct my_msg { long type; int info1; int info2; double info3; } Il primo campo (tipo del messaggio) e' obbligatorio e non fa parte del contenuto del messaggio I successivi sono liberi La dimensione del contenuto del messaggio e' sizeof(struct my_msg) sizeof(long) Marco Faella 11

Inviare messaggi int msgsnd(int id, const void *ptr, size_t nbytes, int flags); Invia il messaggio contenuto all'indirizzo ptr, di dimensione nbytes, sulla coda id, con opzioni flags Restituisce 0 oppure -1 Uso tipico: msgsnd(id, &msg, msg_size, 0); Se la coda e' piena, il processo si blocca finche' non c'e' spazio Marco Faella 12

Osservazioni A differenza delle pipe, le code di messaggi ricordano dove finisce un messaggio e ne comincia un altro (ricordano i record boundaries) I messaggi in coda possono essere eterogenei (dimensioni diverse) Ogni messaggio ha un'etichetta chiamata tipo un processo puo' richiedere messaggi di un dato tipo Marco Faella 13

Ricevere messaggi int msgrcv(int id, const void *ptr, size_t nbytes, long type, int flags); Riceve un messaggio dalla coda id, di tipo type, e lo memorizza all'indirizzo ptr, se la sua dimensione e' al piu' nbytes bytes Restituisce la dimensione effettiva del messaggio ricevuto (oppure -1 in caso di errore) Blocca il processo se la coda e' vuota Marco Faella 14

Ricevere messaggi int msgrcv(int id, const void *ptr, size_t nbytes, long type, int flags); Significato di type type == 0, riceve il primo messaggio type > 0, riceve il primo messaggio di tipo type type < 0, riceve un messaggio di tipo minimo tra quelli di tipo minore o uguale di type Marco Faella 15

Ricevere messaggi int msgrcv(int id, const void *ptr, size_t nbytes, long type, int flags); Che succede se il messaggio e' troppo grande? Nessuna opzione: msgrcv fallisce, il messaggio resta nella coda Opzione MSG_NOERROR: il messaggio viene troncato e ricevuto Marco Faella 16

Osservazioni Piu' processi possono scrivere e leggere sulla stessa coda Per non confondere i flussi, i processi possono usare il tipo dei messaggi Ad esempio, consideriamo un server e tanti client: i client mandano messaggi di tipo 1 il server risponde usando il pid del client come tipo Marco Faella 17

Cancellare una coda int msgctl(int id, int cmd, struct msqid_ds* buf); Per cancellare la coda: msgctl(id, IPC_RMID, NULL) Effetto immediato Eventuali messaggi contenuti sono persi Marco Faella 18

Interludio: scanf char s[100]; scanf( %20s, s); legge una stringa da terminale. Si ferma quando trova un carattere di spaziatura, oppure quando ha letto 20 caratteri scanf( %20[^\n], s); legge una stringa da terminale. Si ferma quando trova un carattere di fine riga, oppure quando ha letto 20 caratteri il carattere di fine riga non va in s, ma rimane nel buffer di input Marco Faella 19

Interludio: scanf scanf( %20[^\n]%*c, s); legge una stringa da terminale. Si ferma quando trova un carattere di fine riga, oppure quando ha letto 20 caratteri inoltre, legge e scarta il carattere successivo quindi, se la lettura era stata fermata da un carattere di fine riga, questo carattere viene rimosso dal buffer di input Marco Faella 20

Esercizio 1 Scrivere un programma C che genera un figlio e comunica con lui usando una coda di messaggi il figlio legge da terminale una stringa e la invia al padre quando il padre riceve una stringa, invia al figlio un messaggio contenente il numero di a nella stringa quando il figlio riceve la risposta dal padre, la mostra sul terminale Assicurarsi che alla fine la coda sia cancellata Marco Faella 21

Esercizio 2 Scrivere due programmi separati, che si comportano da client e server e comunicano usando una coda di messaggi Il server riceve dai client messaggi contenenti numeri interi Quando il server riceve un numero x da un client con pid y, aggiunge al file log.txt la linea y: x Poi, invia una risposta al client y contenente il numero di righe attualmente presenti nel file log.txt Il client invia al server un numero casuale e aspetta di ricevere la risposta dal server. Quando riceve la risposta, la stampa su STDOUT. Il procedimento si ripete a intervalli di 1 secondo. Testare il programma in presenza di numerosi client Marco Faella 22