Argomenti della lezione. Generalità. System calls. Corso di Sistemi Operativi Programmazione di Sistema e Concorrente

Documenti analoghi
Corso di Sistemi Operativi Programmazione di Sistema e Concorrente

Esercitazione 4. Gestione dei file in Unix

Corso di Informatica A.A

Il linguaggio C. Breve panoramica su stdio.h

Laboratorio di Sistemi Operativi

Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Introduzione al C Unità 9 File

Operazioni su file di caratteri

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

Streams e disk files

Laboratorio di Programmazione

File binari e file di testo

Librerie C. Corso di Linguaggi e Traduttori 1 AA

La gestione dell'errore

Capitolo 5 -- Stevens

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

Lezione 22: Input/Output e Files

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

Sistemi Operativi Teledidattico

Gestione dei File. Credits Prof. Campi

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

Introduzione al C. Unità 9 File. D. Bloisi, S. Peluso, A. Pennisi, S. Salza

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

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

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

Digressione: man 2...

Le librerie standard. ! La libreria standard del C è in realtà un insieme di librerie

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

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. File. Marco D. Santambrogio Ver. aggiornata al 6 Marzo 2016

LIBRERIE STANDARD in C. LIBRERIE STANDARD in C

Introduzione. L elaborazione dei files in C. Elaborazione dei files (1) Elaborazione dei files (2) D.D. cap. 11+ pp K.P. pp.

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

Laboratorio di Sistemi Operativi primavera 2009 open

I files (archivi) Il C definisce in stdio.h tre file aperti automaticamente: stdin, stdout e stderr.! Sono ad accesso sequenziale diretto

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. File. Marco D. Santambrogio Ver. aggiornata al 21 Maggio 2014

Files, File I/O. Franco Maria Nardini

Linguaggio C: i file

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. File. Marco D. Santambrogio Ver. aggiornata al 15 Maggio 2015

Introduzione al C. Stream e disk file

Lezione 11: Liste a Puntatori e Input/Output

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

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

Corso di Laboratorio di Sistemi Operativi A.A

Corso di Fondamenti di Programmazione canale E-O. Introduzione. Elaborazione dei files (2)

Sistemi Operativi (M. Cesati)

I files in C. A cura del prof. Ghezzi

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

Università degli Studi di Milano

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

Input / Output. Come già detto, input e output sono realizzati in C da funzioni di stdio.h all'interno della libreria standard

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

Università degli Studi di Milano

Igino Corona

Comandi. Sistema Operativo

ELEMENTI DI INFORMATICA. Linguaggio C

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

Dati due punti sul piano calcolare la loro distanza

LABORATORIO DI SISTEMI OPERATIVI

Il File System di Unix

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

Laboratorio di Sistemi Operativi

Lezione 7: Funzioni e gestione dei File

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

Premessa. Input /output e gestione dei file. I file e gli stream. Il puntatore al file. 21. I FILE NEL LINGUAGGIO C Versione 1.

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

Il File System di UNIX

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. File. Marco D. Santambrogio Ver. aggiornata al 15 Maggio 2013

Input / Output. Come già detto, input e output sono realizzati in C da funzioni di stdio.h all'interno della libreria standard

Architettura dei calcolatori e sistemi operativi. Input Output. IO 2 Il File System

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

Files in C endofile

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

Settimana n.12. Obiettivi File!di!testo. Contenuti Concetto!di!file!e!funzioni! fopen/fclose Funzioni!fgets+sscanf Approfondimenti!su!printf! e!

L accesso ai dispositivi esterni (tastiera, monitor, file,...) viene gestito mediante canali di comunicazione.

Sistemi Operativi (M. Cesati)

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

Indice. La gestione dei file in C e gli stream. Apertura e chiusura di un file. Operazioni sui file. Accesso sequenziale e non sequenziale

Laboratorio di Sistemi Operativi primavera 2009

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

La creazione di un nuovo processo in UNIX

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

Gestione dei file in C

Introduzione alla programmazione in linguaggio C

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 3

La Comunicazione tra Processi in Unix

Laboratorio di Informatica Ingegneria Clinica Lezione 30/11/2011

Introduzione al C. Esercitazione 6. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria Clinica

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

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

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

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

Sistemi Operativi (M. Cesati)

GESTIONE DEI FILE IN C

Input-Output di basso livello

Sistemi Operativi (M. Cesati)

Transcript:

Università di Roma La Sapienza Dipartimento di Informatica e Sistemistica Corso di Sistemi Operativi Programmazione di Sistema e Concorrente Lezione III Gestione dell Input/Output System Calls Argomenti della lezione System calls Struttura del file system UNIX System calls per la gestione dei files ANSI C - Input/Output System calls vs. chiamate a libreria Corso di Sistemi Operativi - Esercitazioni (Lez.3) 2 System calls Generalità Una system call è l unico modo di accedere al kernel del S.O. al fine di effettuare una operazione privilegiata o specifica per l hardware/sistema (in codice assembly) Ad ogni system call è associato un numero univoco In Linux 2.4.9 (RedHat 8.0) sono definite 243 system calls (<asm/unistd.h>) #define NR_syscallname syscallnum Es: #define NR_open 5 Nel Darwin di MacOsX 10.3.2 (<sys/syscall.h>) definite 363 syscalls Corso di Sistemi Operativi - Esercitazioni (Lez.3) 4 1

Implementazione 2 possibili invocazioni dirette: metodo syscall(syscallnum, args ) macro _syscalln definite in <asm/unistd.h> (sconsigliato); Fornite al programmatore attraverso delle funzioni interfaccia (stub), definite in genere nella libreria libc, con lo stesso nome della syscall; Entrambe memorizzano gli argomenti nei registri (limite max), cambiano il modo user in modo kernel (nell 80x86 interrupt 0x80), facendo sì che il kernel esegua il vero e proprio codice della syscall. Corso di Sistemi Operativi - Esercitazioni (Lez.3) 5 Esempio Chiusura di un file Chiamata alla funzione in libc: #include <unistd.h> close(filedescriptor); Chiamata tramite macro: #include <unistd.h> _syscall1(int, close, int, filedescriptor); Chiamata diretta: #include <syscall.h> extern int syscall(int, ); syscall(sys_close, filedescriptor); Corso di Sistemi Operativi - Esercitazioni (Lez.3) 6 Argomenti e valori di ritorno Il numero di argomenti può variare da 0 a 6, a seconda della system call invocata Valori di ritorno: 0 (o +), se la chiamata va a buon fine; -1, se vi sono stati degli errori (assegnano lo specifico codice di errore nella variabile globale errno, definita in <errno.h>) dichiarazione: extern int errno Con la funzione: include <stdio.h> void perror (char *str); si ottiene una descrizione dell errore nel formato: str: messaggio-di-errore \n Corso di Sistemi Operativi - Esercitazioni (Lez.3) 7 Principali system calls Classe Gestione di file Gestione di processi Comunicazione fra processi creat() read() dup() stat() chown() fork() alarm() getpid() msgget() msgrcv() semget() shmget() System Call open() write() link() fstat() umask() execx() signal() getppid() msgctl() pipe() semop() shmctl() close() lseek() unlink() chmod() ioctl() wait() kill() exit() msgsnd() mkfifo() semctl() shmat() Corso di Sistemi Operativi - Esercitazioni (Lez.3) 8 2

Files in UNIX 4 tipi di files: Regolari o ordinari Directory Pipe e Fifo Speciali rappresentano un device (block device o character device) non contengono dati, ma solo un puntatore al device è visto dal file system come una semplice sequenza di bytes (stream) può essere indicato con più di un nome, anche in directory diverse i nomi multipli sono detti link (hard link) e sono tutti equivalenti per il S.O. Corso di Sistemi Operativi - Esercitazioni (Lez.3) 9 Struttura di un file E rappresentato da un inode, che contiene: attributi del file 15 puntatori a blocchi di dati contenuto del file I primi 12 puntano direttamente a blocchi Gli altri tre puntano a blocchi indiretti (single indirect block, double indirect block pointer, triple indirect block) Tutti gli inodes sono memorizzati in un array del file system detto i-list, di dimensione fissata L accesso ad uno specifico inode in una i-list (link) avviene attraverso un i-number (short int) Ogni file di un file system ha un i-number L inode di una directory contiene la lista dei files (inode) in essa contenuti (cambiano gli attributi) Corso di Sistemi Operativi - Esercitazioni (Lez.3) 10 Attributi di un inode Accesso ad un inode {-,d,b,c,p UID (2/4 byte) GID (2/4 byte) date links_count rwx rwx rwx Sticky (1 bit) tipologia di file: normale, directory, block-device, character-device, pipe identificatori del proprietario e del suo gruppo ora dell ultima modifica e dell ultimo accesso al file contatore del numero di hard link al file permessi di accesso per proprietario, gruppo, altri (codifica ottale) per le directory rimuove la possibilità di cancellare files Corso di Sistemi Operativi - Esercitazioni (Lez.3) 11 Una system call indica il file a cui si vuole accedere tramite un file descriptor (int 0) Il file descriptor è utilizzato dal kernel per indicizzare una tabella di file aperti per il processo corrente Ogni entry della tabella contiene un puntatore ad una file structure (vnode) Essa, a sua volta, punta ad un inode Poiché la tabella dei files aperti ha una lunghezza fissa (impostabile solo al boot) c è un limite imposto al # di files aperti contemporaneamente nel sistema Corso di Sistemi Operativi - Esercitazioni (Lez.3) 12 3

System calls per la gestione files in Unix Descrittori speciali ed eredità di descrittori 0 standard input 1 standard output 2 standard error In <unistd.h>: aperti per default alla creazione di un processo i relativi file possono essere chiusi #define STDIN_FILENO 0 /* standard input file descriptor */ #define STDOUT_FILENO 1 /* standard output file descriptor */ #define STDERR_FILENO 2 /* standard error file descriptor */ Corso di Sistemi Operativi - Esercitazioni (Lez.3) 14 Creazione di file int creat(char *file_name, int mode) invoca la creazione di un file; se il file esiste già, rimuove il contenuto del file preesistente, coservando però i suoi diritti di accesso *file_name: puntatore alla stringa di caratteri che definisce il pathname del file da creare mode: specifica i permessi di accesso al file da creare il descrittore di file per l accesso al file creato (-1 se errore) Corso di Sistemi Operativi - Esercitazioni (Lez.3) 15 creat(): errori parte del path della stringa *file_name non è una directory o non esiste la stringa *file_name corrisponde ad una directory esistente non si hanno permessi di accesso ad una delle directory specificate nel path *file_name è un puntatore nullo o punta a un indirizzo di memoria non valido per il processo è già stato raggiunto il # max di file che si possono aprire contemporaneamente Corso di Sistemi Operativi - Esercitazioni (Lez.3) 16 4

creat(): esempio Creazione di un file di nome pippo, nella directory corrente, con permessi di lettura-scrittura per tutti gli utenti #include <stdio.h> void main() { if(creat("pippo",0666) == -1) { printf("errore in chiamata creat\n"); exit(1); Corso di Sistemi Operativi - Esercitazioni (Lez.3) 17 Apertura di un file int open(char *file_name, int option_flags [, int mode]) invoca l apertura di un file esistente è anche possibile invocare la creazione del file *file_name: puntatore alla stringa di caratteri che definisce il pathname del file da aprire option_flags: specifica la modalita di apertura (read, write etc.) mode: specifica i permessi di accesso al file in caso di creazione contestuale all apertura un descrittore per l accesso al file (-1 in caso di fallimento) Corso di Sistemi Operativi - Esercitazioni (Lez.3) 18 Valori per option_flags L option_flags è espresso come combinazione (in bitwise or ) di 1 o più di questi valori, definiti in <fcntl.h>: O_RDONLY: apertura del file in sola lettura; O_WRONLY: apertura del file in sola scrittura; O_RDWR: apertura in lettura e scrittura; O_APPEND: apertura del file con puntatore alla fine del file; ogni scrittura sul file sarà effettuata a partire dalla fine del file; O_CREAT : crea il file con modalità d'accesso specificate da mode solo se esso non esiste; O_TRUNC : elimina il contenuto del file se esso già esiste; O_EXCL : (exclusive) serve a garantire che il file sia stato effettivamente creato dal processo che effettua la chiamata. N.B.: open( pippo, O_WRONLY O_TRUNC O_CREAT, 0660) creat( pippo, 0660) Corso di Sistemi Operativi - Esercitazioni (Lez.3) 19 open(): errori parte del path della stringa *file_name non è una directory o non esiste non si hanno permessi di accesso ad una delle directory specificate nel path il file indicato non esiste e O_CREAT non è presente nella specifica di option_flags; il file indicato esiste già e in option_flags sono specificati O_CREAT e O_EXCL; il file indicato è un file di testo condiviso che è attualmente in uso; *file_name è un puntatore nullo o punta a un indirizzo di memoria non valido per il processo è già stato raggiunto il # max di file che si possono aprire contemporaneamente Corso di Sistemi Operativi - Esercitazioni (Lez.3) 20 5

Chiusura di un file int close(int descriptor) invoca la chiusura di un file e l eventuale svuotamento del buffer descriptor: descrittore del file da chiudere -1 in caso di fallimento descriptor non corrisponde ad un canale di input/output aperto il S.O. chiude automaticamente i file ancora aperti alla terminazione di un processo Corso di Sistemi Operativi - Esercitazioni (Lez.3) 21 Lettura: read() int read(int descriptor, char *buffer* buffer,, unsigned size) invoca la lettura di un dato numero di caratteri (byte) da un file descriptor: descrittore relativo al file (aperto) da cui leggere *buffer: puntatore all area di memoria buffer dove memorizzare i byte letti size: quantità di byte da leggere un intero 0 indicante il numero di byte effettivamente letti (-1 se fail) Corso di Sistemi Operativi - Esercitazioni (Lez.3) 22 read(): errori descriptor non corrisponde ad un canale di input/output aperto descriptor corrisponde ad un canale non aperto in lettura il buffer indicato, avente dimensione size non è contenuto interamente all interno dello spazio di indirizzamento del processo se il # di bytes letti > della dimensione del buffer, i caratteri in eccesso vengono scritti nell area di memoria esterna al buffer: se interna al processo errore non segnalato Corso di Sistemi Operativi - Esercitazioni (Lez.3) 23 Scrittura: write() int write(int int descriptor, char *buffer* buffer,, unsigned size) invoca la scrittura di un certo numero di caratteri su file descriptor: descrittore relativo al file su cui scrivere buffer: puntatore al buffer dal quale vengono prelevati i caratteri che si vogliono scrivere size: quantità di byte da scrivere il numero di byte effettivamente scritti (-1 in caso di fallimento) Corso di Sistemi Operativi - Esercitazioni (Lez.3) 24 6

write(): errori descriptor non corrisponde ad un canale di input/output aperto descriptor corrisponde ad un canale non aperto in scrittura il buffer indicato, avente dimensione size non è contenuto interamente all interno dello spazio di indirizzamento del processo se il # di bytes scritti > della dimensione del buffer, vengono scritti su file anche i bytes contenuti nell area di memoria esterna al buffer la scrittura di X caratteri su un file esistente appena aperto, sostituisce i primi X caratteri di tale file, non effettua troncamento Corso di Sistemi Operativi - Esercitazioni (Lez.3) 25 Un esempio di applicazione: il comando cpcat Scrivere un programma che, attraverso la sintassi: cpcat file_sorg file_dest effettua una copia di file_sorg nominandola file_dest Se il file destinazione già esiste il sistema deve darne notifica all utente Se il file destinazione non viene specificato il sistema deve mostrare il file sullo standard output Corso di Sistemi Operativi - Esercitazioni (Lez.3) 26 Esempio Cosa accade eseguendo il seguente frammento di codice? #include<fcntl.h> int main() { int fd1, fd2; fd1 = open("file1", O_WRONLY O_CREAT O_TRUNC, 0644); fd2 = open("file1", O_WRONLY); write(fd1, Pippo", strlen( Pippo")); write(fd2, Ugo", strlen( Ugo")); close(fd1); close(fd2); Corso di Sistemi Operativi - Esercitazioni (Lez.3) 27 Posizionamento: lseek() int lseek(int descriptor, long offset, int option) modifica il valore del file pointer descriptor: descrittore relativo al file di cui spostare il pointer offset: numero di caratteri di cui viene spostato il file pointer option: indica il punto da cui calcolare lo spostamento SEEK_SET (=0): spostamento a partire da inizio file; SEEK_CUR (=1): spostamento a partire dal valore corrente del file pointer; SEEK_END (=2): spostamento a partire dalla fine del file; nuovo valore del file pointer (# di caratteri dall inizio del file), -1 se fallimento Corso di Sistemi Operativi - Esercitazioni (Lez.3) 28 7

lseek() descriptor non corrisponde a nessun canale di input/output aperto; option ha un valore non ammesso il nuovo file pointer avrebbe un valore negativo Esempi: lseek(fd, 10, 0); /* Sposta di 10 byte dall inizio */ lseek(fd, 20, 1); /* Sposta di 20 byte in avanti */ lseek(fd, -10, 1); /* Sposta di 10 byte indietro */ lseek(fd, -10, 2); /* Sposta a 10 byte dalla fine */ lseek(fd, -10, 0); /* Errore (file pointer immutato) */ Corso di Sistemi Operativi - Esercitazioni (Lez.3) 29 Aliasing di file: link() int link(char *path_name, char *alias_name); invoca la creazione di un alias *path_name: puntatore alla stringa di caratteri che definisce il file di cui si vuole creare un alias *alias_name: puntatore alla stringa di caratteri che definisce il nome dell alias 0 in caso di successo, -1 se fallisce Corso di Sistemi Operativi - Esercitazioni (Lez.3) 30 link(): errori un componente del path_name: non è una directory non esiste supera i limiti *alias_name punta ad una stringa di caratteri che identifica un alias già esistente alias di directory possono essere creati solo dal superuser: *path_name punta ad una directory ed il processo non è un processo di superutente la directory di destinazione per l alias non è accessibile in scrittura Corso di Sistemi Operativi - Esercitazioni (Lez.3) 31 unlink() int unlink(char *alias_name); int unlink(char *alias_name); rimuove l alias indicato, e decrementa il contatore di riferimenti al corrispondente file (campo links_count dell inode) se links_count = 0 il file viene eliminato *path_name: puntatore alla stringa di caratteri che definisce il file di cui si vuole creare un alias *alias_name: puntatore alla stringa di caratteri che definisce il nome dell alias 0 in caso di successo, -1 se fallisce *alias_name identifica un alias inesistente l alias risiede in un file system a sola lettura Corso di Sistemi Operativi - Esercitazioni (Lez.3) 32 8

link() + unlink() = rinomina #include <stdio.h> main(int argc, char *argv[]) { if (argc!= 3) { fprintf(stderr, uso: %s vecchionome nuovonome\n, argv[0]); exit(1); if (link(argv[1], argv[2] == -1) { perror( errore in link ); exit(1); if (unlink(argv[1]) == -1) { perror( errore in unlink ); exit(1); Se la chiamata link fallisce allora esegue perror ed esce, altrimenti crea il link Se la chiamata unlink fallisce esegue perror ed esce, altrimenti elimina il vecchio link Duplicazione di un descrittore In UNIX è possibile duplicare un descrittore di file esistente. Il nuovo descrittore: afferisce allo stesso file associato al descrittore originario; eredita lo stesso file pointer del canale originario; eredita la stessa modalità di accesso al file del canale originario Corso di Sistemi Operativi - Esercitazioni (Lez.3) 33 Corso di Sistemi Operativi - Esercitazioni (Lez.3) 34 dup() int dup(int descriptor); invoca la duplicazione di un descrittore di file descriptor: descrittore di file che si vuole duplicare un intero positivo corrispondente al nuovo descrittore di file (-1 se errore) è il più piccolo indice libero della tavola dei files aperti descriptor non identifica un canale di I/O aperto è già stato raggiunto il # max di file apribili contemporaneamente dal processo Corso di Sistemi Operativi - Esercitazioni (Lez.3) 35 Esercizio Scrivere un programma che, dato un file HTML in ingresso, scriva (su STDOUT o su file) tutto il testo non contenuto in tag HTML < >. Si utilizzi il codice del programma CPCAT, modificandolo opportunamente. Corso di Sistemi Operativi - Esercitazioni (Lez.3) 36 9

ANSI C Input e Output Standard ANSI L ANSI ha definito una libreria di funzioni standard per il linguaggio C (ANSI-C) che riguardano: input/output, gestione delle stringhe, routines matematiche, ; I programmi che limitano la loro interazione con il sistema alle facilities fornite da tale libreria sono portabili su sistemi diversi; Le funzioni offerte da tale libreria sono dichiarate in diversi headers: <stdio.h>, <string.h>, <ctype.h>, <math.h>, ANSI C Standard Library Sistema UNIX Sistema Windows Sistema MAC Corso di Sistemi Operativi - Esercitazioni (Lez.3) 38 Standard Input e Output Stream di testo: sequenza di linee terminate da un carattere di newline Se il sistema non opera in questo modo, la libreria fa ciò che è necessario per far sembrare che lo faccia Ogni sorgente che utilizza una delle funzioni di Input/Output offerte dalla libreria deve includere l header stdio.h: #include <stdio.h> stdin, stdout, stderr per i 3 stream di default Corso di Sistemi Operativi - Esercitazioni (Lez.3) 39 putchar() e getchar() int putchar(int ch) Manda il carattere ch allo stdout Il carattere inviato o la costante EOF se vi sono degli errori EOF è definita in <stdio.h> (solitamente -1) int getchar(void) Legge un carattere dallo stdin e lo restituisce Se non vi sono più caratteri da leggere restituisce EOF Corso di Sistemi Operativi - Esercitazioni (Lez.3) 40 10

Esempio Questo programma converte l input in minuscolo: #include <stdio.h> #include <ctype.h> Contiene la dichiarazione di tolower() main() /* lower: converte l input in minuscolo */ { int c; while ((c = getchar())!= EOF) putchar(tolower(c)); return (0); Corso di Sistemi Operativi - Esercitazioni (Lez.3) 41 Output formattato: printf() int printf(char *format, arg1, ); int sprintf(char *string, char *format, arg1, ); Stampa su schermo (o su stringa) una stringa formattata, costituita da due tipi di oggetti: caratteri ordinari: vengono stampati così come sono; specifiche di conversione: ognuna di esse definisce la conversione e la stampa del successivo argomento passato alla funzione Il numero di caratteri stampati Specifiche di conversione: %[-][min_width][.][precision][h/l][conver_char] Esempio: printf ( var1 = %d; var2 = %s,var1, s1); Stampa: var1 = 5; var2 = ciao, Ritorna: 21 Corso di Sistemi Operativi - Esercitazioni (Lez.3) 42 Carat. d,i o x,x u c s f e,e g,g p Caratteri di conversione Tipo arg. int int int int int char * double double double void * Stampato come Numero decimale Numero ottale unsigned (senza 0 iniziale) Numero esadecimale unsigned (senza 0x o 0X) Numero decimale unsigned Singolo carattere Stringa fino al carattere \0 o precision caratteri [-]m.dddddd, il numero di d è dato dalla precision [-]m.dddddd[e/e][+/-]xx %e o %E se l esponente è < di -4 o precision, altrimenti %f puntatore (rappresentazione dipendente dall implementazione) Corso di Sistemi Operativi - Esercitazioni (Lez.3) 43 Input formattato: scanf() int scanf(char *format, arg1, ); int sscanf(char *string, char *format, arg1, ); Legge caratteri dallo stdin, interpretandoli in base alle specifiche di format, e le memorizza nei successivi argomenti (devono essere puntatori) Si ferma al termine di format, o quando uno degli input non soddisfa la specifica Il numero di variabili lette (ed assegnate) La stringa di formato può contenere: spazi e tabulazioni (non ignorati) caratteri ordinari (non %), che si aspettano di ricevere dallo stream di input specifiche di conversione: %[*][max_width][h/l/l][conver_char] Corso di Sistemi Operativi - Esercitazioni (Lez.3) 44 11

Esempio Programma che riconosce date nei formati: GG Mese Anno (20 Marzo 2003) GG/MM/AA (20/03/03) int giorno, mese, anno; char nomemese[20]; while (getline(linea, sizeof(linea), stdin) > 0) { if (sscanf(linea, %d %s %d, &giorno, nomemese, &anno) == 3) printf( Valido: %s\n, linea); else if (sscanf(linea, %d/%d/%d, &giorno, &mese, &anno) == 3) printf( Valido: %s\n, linea); else printf( Non valido: %s\n, linea); Corso di Sistemi Operativi - Esercitazioni (Lez.3) 45 Manipolazione di stringhe Funzioni definite in <string.h>: strcat(s,t): concatena t alla fine di s strncat(s,t,n): concatena n caratteri di t alla fine di s strcmp(s,t): confronto, ritorna un numero negativo, nullo o positivo se s<t, s==t, s>t strncmp(s,t,n): confronta solo i primi n caratteri strcpy(s,t): copia t in s strncpy(s,t,n): copia al più n caratteri di t in s strlen(s): ritorna la lunghezza di s strchr(s,c): ritorna il puntatore alla prima occorrenza di c in s, o NULL se non presente Corso di Sistemi Operativi - Esercitazioni (Lez.3) 46 Accesso ai file E possibile aprire ulteriori streams, oltre ai 3 standard forniti dal sistema, invocando: FILE *fopen(char* filename, char* mode); filename: stringa contenente il nome del file da aprire; mode: stringa che indica il tipo di accesso al file ( r lettura, w scrittura, a append, b binario) Fa un opportuna richiesta al S.O. e ritorna un puntatore da utilizzare nelle successive operazioni di lettura/scrittura Se il file indicato non esiste: se si accede in modo w o a il file viene creato; se si accede in modo r la funzione ritorna NULL; Corso di Sistemi Operativi - Esercitazioni (Lez.3) 47 Struttura FILE Il puntatore punta alla struttura FILE (definita in <stdio.h>), che contiene informazioni sul file aperto, tra cui: posizione del buffer posizione del carattere corrente nel buffer modalità di apertura file eventuali errori occorsi Anche stdin, stdout e stderr sono dei puntatori a FILE: sono assegnati dal S.O. all avvio di un programma e sono costanti Corso di Sistemi Operativi - Esercitazioni (Lez.3) 48 12

getc(), putc(), fscanf(), fprintf() int putc(int c, FILE *fp); int getc(file *fp); int fprintf(file *fp, char *format, ); int fscanf(file *fp, char *format, ); Sono le generalizzazioni a stream non standard di putchar(), getchar(), printf() e scanf(); Ridefinizione: #define getchar() getc(stdin) #define putchar(c) putc((c), stdout) #define printf(format, ) fprintf(stdout, format, ) #define scanf(format, ) fscanf(stdin, format, ) Corso di Sistemi Operativi - Esercitazioni (Lez.3) 49 Chiusura di un file int fclose(file *fp); Rompe la connessione fra il puntatore ed il file creata con fopen(); Stesse considerazioni delle corrispondenti system calls: Limite massimo al numero di files aperti contemporaneamente chiudere i files non più utilizzati Scarica il buffer delle chiamate putc e getc E invocato automaticamente per ogni file aperto alla terminazione (normale) di un programma Corso di Sistemi Operativi - Esercitazioni (Lez.3) 50 System call vs Funzioni di libreria System calls Standard Posix (UNIX) Codice in kernel space Prestazioni (?) Funzioni: memoria input/output processi comunicazione sincronizzazione gestione eventi asincroni utilities Funzioni di libreria Standard ANSI (C) Codice in process space Portabilità Funzioni: memoria input/output gestione eventi asincroni utilities In UNIX implementate tramite system calls Corso di Sistemi Operativi - Esercitazioni (Lez.3) 51 Esercizio Realizzare il programma cpcat visto precedentemente, utilizzando esclusivamente funzioni standard ANSI C Corso di Sistemi Operativi - Esercitazioni (Lez.3) 52 13