La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

SC che operano su file (1)

Presentazioni simili


Presentazione sul tema: "SC che operano su file (1)"— Transcript della presentazione:

1 SC che operano su file (1)
open(), read(), write(), close()

2 Apertura di un file : SC open()
int open(const char * pathname, int flags) pathname : PN relativo o assoluto del file flags : indicano come voglio accedere al file O_RDONLY sola lettura, O_WRONLY sola scrittura, O_RDWR entrambe eventualmente messe in or bit a bit una o più delle seguenti maschere : O_APPEND scrittura in coda al file, O_CREAT se il file non esiste deve essere creato, O_TRUNC in fase di creazione, se il file esiste viene sovrascritto, O_EXCL in fase di creazione, se il file esiste si da errore

3 Apertura di un file : SC open() (2)
int open(const char * pathname, int flags) risultato : un intero, il descrittore di file (fd) Tabella dei descrittori di file (nella user area) -- Array di strutture, una per ogni file aperto -- Di ampiezza fissa (max 20) Il fd è l’indice del descrittore assegnato al file appena aperto

4 Apertura di un file : SC open() (3)
Tipico codice di apertura di un file : int fd; /*file descriptor */ /* tento di aprire */ fd = open(“s.c”, O_RDONLY); /* controllo errori*/ if(fd==-1) { perror(“fk, in apertura”); exit(errno); /* termina */ }

5 Apertura di un file : SC open() (4)
Tipico codice di apertura di un file uso della macro IFERROR : int fd; /*file descriptor */ /* apertura e controllo errori usando la macro */ IFERROR(fd = open(“s.c”, O_RDONLY), “fk, in apertura”));

6 Apertura di un file : SC open() (5)
Cosa fa la open : segue il path del file per recuparare i suoi attributi e gli indirizzi ai suoi blocchi dati (i-node) controlla i diritti di accesso (li confronta con le richieste in flags) se l’accesso è consentito assegna al file l’indice di una posizione libera nella tabella dei descr. (fd) aggiorna le strutture dati interne al nucleo … se si è verificato un errore ritorna -1 (errno) altrimenti ritorna fd, che deve essere usato come parametro per tutti gli accessi successivi

7 Apertura di un file : SC open() (6)
Strutture di nucleo legate ai file Pos.Corrente 0 write/read fd Copia dell’i-node Tabella degli i-node attivi Tabella dei descrittori di file (user area) Tabella dei file aperti

8 Lettura: SC read() Es: lung = read(fd,buffer,N) Numero massimo
di byte da leggere File descriptor (void *) puntatore all’area di memoria dove andare a scrivere i dati -1 : errore n > 0 : numero byte letti 0 : Pos.Corrente è a fine file Effetto: Legge al più N byte a partire da Pos.Corrente, Pos.Corrente += lung

9 Lettura: SC read() (2) Tipico ciclo di lettura da file:
int fd, lung; /* fd, n byte letti */ char buf[N]; /*buffer*/ /* apertura file */ IFERROR(fd = open(“s.c”, O_RDONLY), “fk, in apertura”)); while ((lung = read(fd,buf,N))>0){ } IFERROR(lung,”fk, in lettura”);

10 Scrittura: SC write() Es: lung = write(fd,buffer,N) Numero massimo
di byte da scrivere File descriptor (void *) puntatore all’area di memoria dove andare a prendere i dati -1 : errore n => 0 : numero byte scritti Effetto: Scrive al più N byte a partire da Pos.Corrente, Pos.Corrente += lung

11 Lettura: SC write() (2) Es. scrittura sullo stdout (fd 1):
int fd, lung; /* fd, n byte letti */ char buf[N]; /*buffer*/ IFERROR(fd = open(“s.c”, O_RDONLY), “fk, in apertura”)); while ((lung = read(fd,buf,N))>0){ IFERROR(write(1, buf, lung), “fk, in scrittura”)); } IFERROR(l,”fk, in lettura”);

12 Chiusura: la SC close()
Libera le aree di occupate nelle varie tabelle int close (int fd)

13 Chiusura: SC close() (2)
Es. chiusura di un file …. int fd, lung; /* fd, n byte letti */ char buf[N]; /*buffer*/ IFERROR(fd = open(“s.c”, O_RDONLY), “fk, in apertura”)); while ((lung = read(fd,buf,N))>0){ IFERROR(write(1, buf, lung), “fk, in scrittura”)); } IFERROR(lung,”fk, in lettura”); IFERROR(close(fd),”fk, in chiusura”);

14 Standard input, output and error
Ogni processo Unix ha dei ‘canali di comunicazione’ predefiniti con il mondo esterno es. $sort stdout Tipicamente lo schermo P stdin Tipicamente la tastiera stderr Tipicamente lo schermo

15 Standard input, output and error (2)
Un esempio stdin stdout 1 Copia dell’i-node di ttyX stderr 2 Tabella degli i-node attivi Tabella dei descrittori di file (user area) Tabella dei file aperti

16 Su: open() vs fopen()e similari
open(), read(), write(), close() fanno parte della libreria standard POSIX per i file e corrisponde ad una SC fopen(), fread(), fwrite(), fclose(), printf() fanno parte della libreria standard di I/O (stdio.h) definito dal comitato ANSI

17 Su: open() vs fopen()e similari (2)
le funzioni di stdio.h effettuano un I/O bufferizzato se il programma termina in modo anomalo i buffer possono non essere svuotati in tempo mischiare chiamate ad I/O bufferizzato e non può portare a risultati impredicibili nel vostro programma usate o le chiamate POSIX (non bufferizzate) o le chiamate a funzioni in stdio.h (bufferizzate) ma non entrambe

18 Posizionamento : lseek()
off_t lseek(int fd, off_t offset, int whence) fd : file descriptor offset : di quanti byte voglio spostarmi whence : da dove calcolo lo spostamento. Può essere una delle seguenti macro SEEK_SET dall’inizio, SEEK_END dalla fine, SEEK_CUR dalla posizione corrente Ritorna : la posizione corrente in caso di successo , -1 in caso di fallimento

19 Attributi : stat() int stat(const char* pathfile, struct stat *buf)
pathfile : path del file buf : puntatore alla struttura struct stat in cui verranno inserite le informazioni

20 Attributi : stat() (2) struct stat { …
ino_t st_ino; /* numero dell’i-node*/ mode_t st_mode; /* diritti protezione*/ nlink_t st_nlink; /* # hard link */ uid_t st_uid; /* ID owner */ off_t st_size; /* lung totale (byte)*/ unsgn long st_blksize;/* dim blocco */ unsgn long st_blocks; /* #blk 512byte occupati*/ time_t st_atime; /* ultimo accesso*/ time_t st_mtime; /* ultima modifica */ time_t st_ctime; /* ultima var dati */ }

21 Attributi : stat() (3) struct stat info;
IFERROR(stat(“dati”,&info), “In stat”); if (S_ISLNK(info.st_mode)){/* link simbolico*/} if (S_ISREG(info.st_mode)){/* file regolare*/} if (S_ISDIR(info.st_mode)){/* directory */} if (S_ISCHR(info.st_mode)){/* spec caratteri */} if (S_ISBLK(info.st_mode)){/* spec blocchi */} if (info.st_mode & S_IRUSR){/* r per owner */} if (info.st_mode & S_IWGRP){/* w per group */}

22 Directory Il formato delle directory varia nei vari FS utilizzati in ambito Unix Quando una directory viene aperta viene restituito un puntatore a un oggetto di tipo DIR (definto in dirent.h) es. DIR* mydir;

23 Directory: opendir, closedir
DIR* opendir(const char* pathdir);, pathdir: path directory ritorna il puntatore all’handle della directory, o NULL se si è verificato un errore int closedir(DIR* dir); dir: puntatore all’ handle di una directory già aperta

24 Directory: opendir, closedir (2)
DIR * d; /* esempio di apertura directory */ if ((d = opendir(".")) == NULL){ perror("nell'apertura"); exit(errno); } /* lavoro sulla directory */ /* chiusura directory */ IFERROR(closedir(d),"nella chiusura");

25 Directory: readdir struct dirent* readdir(DIR * dir);,
dir : handle della directory ritorna il puntatore ad una struttura struct dirent contenente le informazioni dell’elemento della directory che descrive il prossimo file letture successive forniscono i file successivi ritorna NULL quando i file sono finiti per tornare all’inizio void rewinddir(DIR * dir);,

26 Directory: readdir (2) /* campi interessanti di dirent … */
struct dirent { /* # di i-node */ long d_ino; /*lunghezza di d_name */ unsigned short d_reclen; /* nome del file */ char d_name[NAMEMAX+1]; }

27 Directory: readdir (3) DIR * d; struct dirent * file;
/* …. apertura directory */ /* lettura di tutte le entry della directory */ while ( (file = readdir(d))!=NULL) { /* ad esempio stampo gli attributi di un file */ printattr(file->d_name); } /* chiusura directory */ IFERROR(closedir(d),"nella chiusura");

28 Directory corrente ... int chdir(const char* path) int fchdir(int fd)
sono vere chiamate di sistema cambiano la directory corrente con quella indicata char* getcwd(char* buf, size_t size) permette di leggere la directory corrente scrive il nome in buf (per un massimo di size caratteri) se non ci riesce ritorna NULL


Scaricare ppt "SC che operano su file (1)"

Presentazioni simili


Annunci Google