Corso di Reti di Calcolatori L-A

Documenti analoghi
ESEMPI DI APPLICAZIONI ONC-RPC

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Chiamate a Procedure Remote

Esercitazione 4. Comandi iterativi for, while, do-while

Esercitazione 5. Procedure e Funzioni Il comando condizionale: switch

Esercitazione 6. Array

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Lettura da tastiera e scrittura su monitor

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Precedenza e associatività. Complementi sul C - 2. Esempi. Esempi

Array. Maurizio Palesi Salvatore Serrano. In C si possono definire tipi strutturati Vi sono due costruttori fondamentali

Scrittura formattata - printf

Introduzione al C. Unità 8 Stringhe

Esercitazione 3. Espressioni booleane I comandi if-else e while

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

TUTORATO di LINGUAGGI I

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

L Allocazione Dinamica della Memoria

Funzioni. Il modello console. Interfaccia in modalità console

2001 Pier Luca Montessoro, Davide Pierattoni (si veda la nota di copyright alla slide n. 2) Fondamenti di Informatica.

Consideriamo un vettore allocato dinamicamente

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

Linguaggio C I puntatori

Esercizi C su array e matrici

Esercitazione 3. Oggi sono stati effettuati semplici esercizi in C utilizzando le seguenti istruzioni: if...else, while, printf, scanf

La gestione dei caratteri in C

LIA. LIA - DEIS - Facoltà di Ingegneria - Università di Bologna Elementi di informatica L

Variabili e Istruzioni

Laboratorio di programmazione

Sviluppo dei Programmi

ESERCIZI DI PROGRAMMAZIONE DA TEMI D ESAME - vettori -

Il generatore di numeri casuali

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Istruzioni di ciclo. Unità 4. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Introduzione a. Funzioni di Ingresso e Uscita. Compilazione

Indovina la lettera...

IL PRIMO PROGRAMMA IN C

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

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

Politecnico di Torino Sede di Alessandria Corso di informatica Programmazione in c: introduzione. e mail: sito: users.iol.

Istruzioni iterative (o cicliche)

Linguaggio C. strutture di controllo: strutture iterative. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

Input/output in C e in C++

Gestione di files Motivazioni

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

Gestione dei file. File di testo e binari

La programmazione in linguaggio C

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

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ&

Programmi su più moduli - Esempio

Laboratorio di Programmazione 1 [Java]

Introduzione al C. Esercitazione 6. Raffaele Nicolussi. Corso di Fondamenti di Informatica Ingegneria Clinica

CARATTERI E STRINGHE Caratteri e stringhe Funzioni della libreria standard I/O Funzioni della libreria di gestione delle stringhe

Laboratorio di Algoritmi e Strutture Dati

Problem solving avanzato

Stringhe di caratteri

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

L'allocazione dinamica della memoria

Definizione di metodi in Java

Unità Didattica 5 Linguaggio C. Stringhe. Accesso a file ASCII. Strutture.

Sistemi Operativi Anno Accademico 2011/2012. Segnali: Interrupt software per la gestione di eventi asincroni

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

IDE DevC

3. Terza esercitazione autoguidata: progetto gestione voli

Breve riepilogo della puntata precedente:

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prima prova in itinere COGNOME E NOME. 13 novembre 2006 RIGA COLONNA MATRICOLA

Modulo 2: Strutture fondamentali della programmazione Java

Esempio 1: stampa locale di file remoto

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Caratteri e stringhe

argc, argv, getopt acquisizione e gestione di argomenti e opzioni da linea di comando

Il presente plico contiene 3 esercizi e deve essere debitamente compilato con cognome e nome, numero di matricola.

I puntatori e l allocazione dinamica di memoria

Esercizio 1: calcolo del massimo di una sequenza (versione 1)

Caratteri e stringhe. Vettori di caratteri. Il tipo stringa Terminatore nullo Input/output di stringhe Politecnico di Torino 1

Linguaggio C: Introduzione ad ambienti di sviluppo integrati (IDE) e a Dev-C++ Università degli Studi di Brescia

18/01/16. Soluzione degli esercizi svolti in aula alla lavagna. Seconda lezione. Cast

06AZN - Fondamenti di Informatica (GES, LOP, ORG) Esercitazione di laboratorio n. 8 (1/12/09)

Creare una funzione float square(float x). La funzione deve restituire il quadrato del parametro x.

argc, argv, getopt acquisizione e gestione di argomenti e opzioni da linea di comando

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Linguaggio C - Funzioni

main() { int i; int a[10]={1,2,3,4,5,6,7,8,9,10}; /* inizializzazione in fase di definizione */ int b[10];

Esercitazione 5. Corso di Fondamenti di Informatica. Laurea in Ingegneria Informatica

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Strutture Dinamiche. Fondamenti di Informatica

Problemi, algoritmi e oggetti

ESEMPIO: le variabili LETTURA/SCRITTURA DI VARIABILI. Specifica Leggere da tastiera un intero, un carattere, un float e un double. Stamparli a video.

1. PARALLELISMO E PROCESSI. 1.1 La necessità del parallelismo

RICORSIONE - schema ricorsivo (o induttivo) si esegue l'azione S, su un insieme di dati D, mediante eventuale esecuzione di

Gestione dei File in C

Appello di Informatica B

Fondamenti di Informatica 2

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

Indice PARTE A. Prefazione Gli Autori Ringraziamenti dell Editore La storia del C. Capitolo 1 Computer 1. Capitolo 2 Sistemi operativi 21 XVII XXIX

Linguaggio C La libreria standard

Transcript:

Università degli Studi di Bologna Facoltà di Ingegneria Corso di Reti di Calcolatori L-A Esercitazione 9 (svolta) RPC: Inizializzazione Strutture Dati sul Server Luca Foschini Anno accademico 2010/2011 Esercitazione 9 1 Specifica Si richiede la progettazione e la realizzazione del servizio di prenotazione delle postazioni di una sala lettura. Le postazioni sono organizzate in file e colonne, e si prevedono tre tipi di prenotazioni: Bibliotecari (B), Professori (P), e Dottorandi (D). Si realizzino le operazioni per: Prenotare una postazione: questa operazione richiede all'utente il tipo di prenotazione, la fila e la colonna, quindi aggiorna la struttura dati contenente le prenotazioni; Visualizzare lo stato della sala: questa operazione visualizza l attuale stato di occupazione della sala indicando, per ogni postazione, il tipo di prenotazione. Esercitazione 9 2

Struttura dati La struttura dati con lo stato della sala potrebbe essere visualizzata con la seguente tabella; ogni postazione libera viene etichettata con il carattere L, mentre le postazioni occupate sono opportunamente etichettate con B, P, o D a secondo del tipo di prenotazione. Col. 1 Col. 2 Col. 3 Col. 4 Col. 5 Col. 6 Col. 7 Fila 1 L L L L L L L Fila 2 D L L L D D B Fila 3 L P L L D D L Fila 4 L L L L D D L Fila 5 L L L L L L L Fila 6 L L P L P P L Fila 7 L L L L P P L Esercitazione 9 3 Specifica: Ulteriori Dettagli Il Client realizza l interazione con l utente proponendo ciclicamente i servizi che utilizzano le due procedure remote e stampa a video gli esiti delle chiamate, fino alla fine del file di input da tastiera. Il Server implementa le procedure invocabili: La procedura prenota_postazione accetta come parametro d ingresso la struttura dati Input contenente il tipo di prenotazione ( B, P, o D ), la fila e la colonna che si vogliono prenotare, e restituisce l esito dell operazione - 0 in caso di successo, -1 altrimenti: ad esempio, se il posto che si vuole occupare è già prenotato. La procedura visualizza_stato non ha alcun parametro di ingresso (ha come parametro di ingresso un puntatore a void), e restituisce la struttura dati Sala che rappresenta lo stato di occupazione attuale della sala. Esercitazione 9 4

Inizializzazione Struttura Dati C è un problema di inizializzazione della struttura dati che mantiene lo stato di occupazione della sala sul server: la struttura deve essere inizializzata prima della partenza del server impostando tutte le postazioni allo stato di default libero (stato L ). Nella generazione automatica del codice, RPCGEN produce lo stub del programma server (che contiene il main)... Bisogna considerare soluzioni per attuare l operazione di inizializzazione, eventualmente anche modificando i file generati in modo automatico. Esercitazione 9 5 Inizializzazione Struttura Dati: Possibilità 1. Inserire una procedura locale di inizializzazione nel file utente contenente le procedure remote. L invocazione di una qualsiasi procedura remota invocata dal client, provoca l invocazione di tale procedura se e solo se l inizializzazione non è già stata invocata (introduzione di una variabile di controllo static nel file utente). 2. Aggiungere all interfaccia del server una procedura remota di inizializzazione. Tale procedura remota deve essere invocata dal client prima di qualsiasi altra procedura, e che deve essere eseguita dal server al più una volta. 3. Inserire il codice di inizializzazione direttamente all interno del main (stub del server); 4. Inserire una procedura locale di inizializzazione nel file utente contenente le procedure remote. Tale procedura deve essere invocata all interno del main prima dell invocazione della procedura svc_run() che mette il server in ascolto di nuove richieste. Per poter fare questo, è necessario dichiarare la procedura di inizializzazione come extern all interno del file dello stub contenente stub e main (lato server). Esercitazione 9 6

File sala.x const LUNGHFILA=7; const NUMFILE=10; struct Input{ char tipo; int fila; int colonna; ; struct Fila { char posto[lunghfila]; ; struct Sala { Fila fila[numfile]; ; program SALA { version SALAVERS{ int PRENOTA_POSTAZIONE(Input) = 1; Sala VISUALIZZA_STATO(void) = 2; = 1; = 0x20000013; Compilazione per generare il file header, il file per le conversioni xdr e gli stub: rpcgen sala.x Esercitazione 9 7 File sala_s.c: inizializza() #include... /* STATO SERVER */ static Sala sala; /* variabile per la sala */ static int inizializzato=0; /* inizializzazione attuata */ void inizializza() // Possibilità 1 { int i, j; if( inizializzato == 1 ) return; // inizializzazione struttura dati for (i = 0; i < NUMFILE; i++) for (j = 0; j < LUNGHFILA; j++) sala.fila[i].posto[j] = 'L'; // Eventuale riempimento altri posti sala.fila[1].posto[0] = 'D'; sala.fila[2].posto[1] = 'P'; sala.fila[5].posto[2] = 'P';... inizializzato = 1; printf("terminata inizializzazione struttura dati!\n"); Esercitazione 9 8

File sala_s.c: implementazione procedure int * prenota_postazione_1_svc (Input *input, struct svc_req *rqstp) { static int result = -1; result=-1; inizializza(); // Invoco l inizializzazione if(sala.fila[input->fila].posto[input->colonna]!='l') return (&result); else{ sala.fila[input->fila].posto[input->colonna]=input->tipo; result=0; return (&result); // prenota_postazione Sala* visualizza_stato_1_svc(void *in, struct svc_req *rqstp) { inizializza(); // Invoco l inizializzazione return (&sala); // visualizza_stato Esercitazione 9 9 File sala_c.c: implementazione del client 1/4 #include... main (int argc, char *argv[]) {char *host; CLIENT *cl; int *ris, *start_ok; void *in; Sala *sala; Input input; char str[5]; char c, ok[256]; int i, j, fila, col; if (argc!= 2) { printf ("usage: %s server_host\n", argv[0]); exit (1); host = argv[1]; cl = clnt_create (host, SALA, SALAVERS, "udp"); if (cl == NULL) { clnt_pcreateerror (host); exit (1); Esercitazione 9 10

File sala_c.c: implementazione del client 2/4 printf("inserire:\nv) per vedere la sala\tp) per prenotare la postazione \t^d per terminare: "); while (gets (ok)) { if( strcmp(ok,"p")==0 ) {gets(ok); // Leggo e controllo il tipo while( (strcmp(ok, "P")!=0) && (strcmp(ok, "D")!=0) && (strcmp(ok, "B")!=0) ) { printf("lettera sbagliata! Inserisci P, D o B: \n"); gets(ok); input.tipo = ok[0]; fila = -1; // Leggo la fila while( fila < 0 fila > (NUMFILE-1) ) { printf("inserisci la fila (da 0 a %i): \n", (NUMFILE-1)); while (scanf("%i", &fila)!= 1) { do { c = getchar(); printf("%c ", c); while (c!= '\n'); printf("fila: "); gets(ok); //Consumo fine linea input.fila = fila; Esercitazione 9 11 File sala_c.c: implementazione del client 3/4 col=-1; // Leggo la colonna while( col<0 col>(lunghfila-1) ) { printf("inserisci la colonna (da 0 a %i): \n", (LUNGHFILA-1)); while (scanf("%i", &col)!= 1) { do{c=getchar(); printf("%c ", c); while (c!= '\n'); printf("colonna: "); gets(ok); // Consumo fine linea input.colonna = col; ris = prenota_postazione_1(&input, cl); // Invocazione remota if(ris == NULL) { clnt_perror(cl, host); exit(1); if(*ris<0) printf("problemi...\n"); else printf("prenotazione effettuata con successo\n"); // if P /* ad ogni invocazione controlliamo sempre che non ci sia stato un errore di RPC (risultato NULL) e poi di logica (a secondo del valore atteso e dalla logica del programma */ Esercitazione 9 12

File sala_c.c: implementazione del client 4/4 else if( strcmp(ok,"v")==0 ) {sala = visualizza_stato_1(in,cl); // Invocazione remota if(sala == NULL) { clnt_perror(cl, host); exit(1); printf("stato di occupazione della sala:\n"); for(i=0; i<numfile; i++) { for(j=0; j<lunghfila; j++) printf("%c\t", sala->fila[i].posto[j]); printf("\n"); // if V else printf("argomento di ingresso errato!!\n"); printf("inserire:\nv) per vedere la sala\tp)... "); // while // Libero le risorse, distruggendo il gestore di trasporto clnt_destroy (cl); exit (0); // main Esercitazione 9 13 Compilazione ed Esecuzione Compilazione per generare l'eseguibile del client: gcc -o c sala_c.c sala_clnt.c sala_xdr.c produce il comando c Compilazione per generare l'eseguibile del server: gcc o s sala_s.c sala_svc.c sala_xdr.c produce il comando s Esecuzione 1.Mandare in esecuzione il server con il comando: s 2.Mandare in esecuzione il client con il comando: c serverhost Esercitazione 9 14