Scrivere alla fine di un file Vi sono due modi per scrivere alla fine di un file:

Documenti analoghi
Scrivere alla fine di un file Vi sono due modi per scrivere alla fine di un file:

Comandi. Sistema Operativo

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

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

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

Gestione di File e Directory

File e Directory. M. Guarracino - File e Directory 1

Il sistema operativo LINUX Il file system. Indice. Blocchi logici. Indice. Super block. G. Di Natale, S. Di Carlo

Digressione: man 2...

File e Directory. M. Guarracino - File e Directory 1

File. Gestione memoria - 19/01/2003 1/11

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 3

Modello di Programma in UNIX

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

Directory. Le directory unix sono file.

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

CREAZIONE DI UN FILE

Gestione dei file: filosofia. carica in memoria l i-node del file read / write. close cose rilascia le strutture dati di memoria del file

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

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

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

Digressione: man (2)...

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

Laboratorio di Sistemi Operativi

Modulo 5: Programmazione di sistema --- Parte C: System call per la gestione dei file

Capitolo 5 -- Stevens

Sistemi Operativi (M. Cesati)

1. File normale: contiene dati 2. Directory: contiene nomi di altri file ed informazioni sugli stessi

Program m azione di Sistem a 2a

Chiamate di sistema per la Inter Process Communication (IPC) in POSIX. E.Mumolo, DEEI

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

Linux - La Shell Bash

Gestione dei file: filosofia. carica in memoria l i-node del file read / write. close cose rilascia le strutture dati di memoria del file

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

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

Chiamate di sistema. Pipe Flussi di I/O

Igino Corona

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

POSIX - Gestione dei file. E.Mumolo, DEEI

Progetto II: Il linguaggio C e le chiamate di sistema sui processi

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

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

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

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

Capitolo 3 -- Stevens

Sistemi Operativi Teledidattico

Corso di Laboratorio di Sistemi Operativi

Processore Danilo Dessì. Architettura degli Elaboratori.

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

Laboratorio di Elementi di Architetture e Sistemi Operativi Esercizi del 18 Aprile 2012

Chiamate di sistema per la Gestione dei processi in POSIX. E.Mumolo, DEEI

POSIX Systems Programming. geek evening 0x0d. ambienti POSIX. By lord_dex ZEI e Salug! presentano:

ESERCIZI RISOLTI IN C LANGUAGE (programmazione avanzata)

Introduzione al C. Stream e disk file

5. I device driver. Device driver - gestori delle periferiche. Struttura interna del sistema operativo Linux. Tipi di periferiche. Tipi di periferiche

Program m azione di Sistem a 5

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

L ambiente di un processo (I)

Introduzione ai socket

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

LABORATORIO di Reti di Calcolatori

Struttura interna del sistema operativo Linux

System call per la gestione di processi

SmallShell Piccolo processore comandi

Esercitazione E2 Chiamate di sistema

Introduzione ai Device Drivers in Linux. E.Mumolo, DEEI

Struttura interna del sistema operativo Linux. Il file system. -revisione del 30 marzo 2004

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

CAP9. Device drivers

Corso di Sistemi Operativi Esercitazioni

E.Mumolo, DEEI

Program m azione di Sistem a 2

System call fcntl e record locking

Sistemi operativi Modulo II I semafori 2 Select

Corso di Programmazione Concorrente Processi. Valter Crescenzi

La Comunicazione tra Processi in Unix

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

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

CAP.8: Il file system

I File in Unix. Primitive (System Call) Processo

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

Controllo dei Processi 1

Il file system. dell 11. -Revisione. l 11 Aprile 2005

1.4: Il File System. File, directory, file system. Struttura e operazioni su file e directory. Implementazione delle directory

I/O su Socket TCP: read()

Filesystem-centrismo

Sistemi Operativi. Esercitazione 10. Corso di Laurea Triennale in Ingegneria Informatica.

Variabili e Metodi di classe Interfacce e Package Gestione di File in Java

Sezione 2: chiamate di sistema

Laboratorio di Sistemi Operativi. System Call

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

Librerie C. Corso di Linguaggi e Traduttori 1 AA

Gestione dei file. File di testo e binari

Corso di Sistemi Operativi Programmazione di Sistema e Concorrente

Laboratorio di Programmazione in Rete

8. IL FILE SYSTEM. 1. I servizi per la gestione dei file

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

Programmazione di sistema

Gestione di files Motivazioni

Linguaggio C: i file

Transcript:

Scrivere alla fine di un file Vi sono due modi per scrivere alla fine di un file: usare lseek per spostarsi alla fine del file e poi scrivere: lseek(filedes, (off_t)0, SEEK_END); write(filedes, buf, BUFSIZE); usare open con il flag O APPEND: filedes = open("nomefile", O_WRONLY O_APPEND); write(filedes, buf, BUFSIZE); Altri flag utili nell utilizzo di open sono i seguenti: O_RDONLY: apre il file specificato in sola lettura. O_RDWR: apre il file specificato in lettura e scrittura. O_CREAT: crea un file con il nome specificato; con questo flag è possibile specificare come terzo argomento della open un numero ottale che rappresenta i permessi da associare al nuovo file (e.g., 0644). O_TRUNC: tronca il file a zero. O_EXCL: flag esclusivo ; un tipico esempio d uso è il seguente: filedes = open("nomefile", O_WRONLY O_CREAT O_EXCL, 0644); che provoca un fallimento nel caso in cui il file nomefile esista già.

Eliminare un file Per cancellare un file vi sono due system call a disposizione del programmatore: #include <unistd.h> int unlink(const char *pathname); #include <stdio.h> int remove(const char *pathname); Entrambe le system call hanno un unico argomento: il pathname del file da eliminare. Esempio: remove("/tmp/tmpfile"); Inizialmente esisteva soltanto unlink, mentre remove è stata aggiunta in seguito come specifica dello standard ANSI C per l eliminazione dei file regolari.

La chiamata di sistema fcntl La system call fcntl permette di esercitare un certo grado di controllo su file già aperti: #include <sys/types.h> #include <unistd.h> #include <fcntl.h> int fcntl(int filedes, int cmd,...); I parametri dal terzo in poi variano a seconda del valore dell argomento cmd. L utilizzo più comune di fcntl si ha quando cmd assume i seguenti valori: F_GETFL: fa in modo che fcntl restituisca il valore corrente dei flag di stato (come specificati nella open). F_SETFL: imposta i flag di stato in accordo al valore del terzo parametro. Esempio: if(fcntl(filedes, F_SETFL, O_APPEND) == -1) printf("fcntl error\n");

Esempio d uso di fcntl #include <fcntl.h> int filestatus(int filedes) { int arg1; if((arg1 = fcntl(filedes, F_GETFL)) == -1) { printf("filestatus failed\n"); return -1; printf("file descriptor %d", filedes); switch(arg1 & O_ACCMODE) { case O_WRONLY: printf("write only"); break;

Esempio d uso di fcntl (... continua) case O_RDWR: print("read write"); break; case O_RDONLY: print("read only"); break; default: print("no such mode"); break; if(arg1 & O_APPEND) printf(" - append flag set"); printf("\n"); return 0; dove O_ACCMODE è una maschera appositamente definita in <fcntl.h>.

stat e fstat Le informazioni e le proprietà dei file (dispositivo del file, numero di inode, tipo del file, numero di link, UID, GID, dimensione in byte, data ultimo accesso/ultima modifica, informazioni sui blocchi che contengono il file) sono contenute negli inode. Le chiamate di sistema stat e fstat permettono di accedere in lettura alle informazioni e proprietà associate ad un file: #include <sys/types.h> #include <sys/stat.h> int stat(const char *pathname, struct stat *buf); int fstat(int filedes, struct stat *buf); L unica differenza fra le due system call consiste nel fatto che, mentre stat prende come primo argomento un pathname, fstat opera su un descrittore di file. Quindi fstat può essere utilizzata soltanto su file già aperti tramite la open.

La struttura stat stat è una struttura definita in <sys/stat.h> che comprende i seguenti componenti (i tipi sono definiti in <sys/types.h>): Tipo Nome Descrizione dev_t st_dev logical device ino_t st_ino inode number mode_t st_mode tipo di file e permessi nlink_t st_nlink numero di link non simbolici uid_t st_uid UID gid_t st_gid GID dev_t st_rdev membro usato quando il file rappresenta un device off_t st_size dimensione logica del file in byte time_t st_atime tempo dell ultimo accesso time_t st_mtime tempo dell ultima modifica time_t st_ctime tempo dell ultima modifica alle informazioni della struttura stat long st_blksize dimensione del blocco per il file long st_blocks numero di blocchi allocati per il file

Esempio (I) Il programma lookout.c, data una lista di nomi di file, controlla ogni minuto se un file è stato modificato. Nel caso ciò avvenga termina l esecuzione stampando un messaggio che informa l utente dell evento. #include <stdlib.h> #include <stdio.h> #include <sys/stat.h> #define MFILE 10 void cmp(const char *, time_t); struct stat sb; main(int argc, char **argv) { int j; time_t last_time[mfile+1];

Esempio (II) if(argc<2) { fprintf(stderr, "uso: lookout file1 file2...\n"); exit(1); if(--argc>mfile) { fprintf(stderr, "lookout: troppi file\n"); exit(1); for(j=1; j<=argc; j++) { if(stat(argv[j], &sb) == -1) { fprintf(stderr, "lookout: errore nell accesso al file %s\n", argv[j]); exit(1); last_time[j] = sb.st_mtime;

Esempio (III) for(;;) { for(j=1; j<=argc; j++) cmp(argv[j], last_time[j]); sleep(60); void cmp(const char *name, time_t last) { if(stat(name, &sb) == -1 sb.st_mtime!= last) { fprintf(stderr, "lookout: il file %s e stato modificato\n"); exit(0);

Memory mapped I/O Quando è necessario eseguire molte operazioni di I/O su disco, si genera un forte carico di lavoro sul sistema in quanto i dati su disco vengono copiati prima nei buffer interni del kernel e poi nelle strutture dati che sfruttano lo spazio di memoria dedicato al processo che ha eseguito la richiesta. Per evitare questo overhead si può mappare i file direttamente nello spazio di memoria riservato al processo. La memoria di un processo può essere manipolata mediante le seguenti funzioni: #include <string.h> void * memset(void *buf, int character, size_t size); void * memcpy(void *buf1, const void *buf2, size_t size); void * memmove(void *buf1, const void *buf2, size_t size); void * memcmp(const void *buf1, const void *buf2, size_t size); void * memchr(const void *buf, int character, size_t size);

La chiamata di sistema mmap Il prototipo della system call mmap è definito come segue: #include <sys/mman.h> void * mmap(void *address, size_t length, int protection, int flags, int filedes, off_t offset); dove: address è l indirizzo del punto in cui inizierà il mapping (se si passa 0, è il sistema a decidere e mmap restituisce l indirizzo risultante); length è il numero di byte da mappare; protection determina se i dati mappati possono essere letti (PROT_READ), scritti (PROT_WRITE), eseguiti (PROT_EXEC) o se non si può accedere ad essi (PROT_NONE); flags determina se i cambiamenti ai dati mappati siano visibili agli altri processi ed eventuali modifiche scritte su disco (MAP_SHARED) oppure no (MAP_PRIVATE); filedes è il descrittore del file da mappare; offset rappresenta il punto nel file da cui iniziare il mapping.

La chiamata di sistema munmap Il mapping viene eliminato automaticamente ed eventuali modifiche salvate su disco (nel caso in cui si sia specificato come protezione MAP_SHARED), quando il processo termina. Per eliminare manualmente il mapping si può usare la system call munmap: #include <sys/mman.h> void * munmap(void *address, size_t length); Si noti che munmap non chiude il file mappato (per ottenere ciò bisogna eseguire una close).

Esempio: memory mapped file copy (I) Il programma copyfile.c copia il file passato come primo argomento nel file passato come secondo argomento: #include <stdio.h> #include <sys/mman.h> #include <fcntl.h> main(int argc, char **argv) { int input, output; size_t filesize; void *source, *target; char endchar= \0 ; if(argc!= 3) { fprintf(stderr, "utilizzo: copyfile file1 file2\n"); exit(1);

Esempio: memory mapped file copy (II) if((input = open(argv[1], O_RDONLY)) == -1) { fprintf(stderr, "errore: impossibile aprire il file %s\n", argv[1]); exit(1); if((output = open(argv[2], O_RDWR O_CREAT O_TRUNC, 0666)) == -1) { close(input); fprintf(stderr, "errore: impossibile aprire il file %s\n", argv[2]); exit(2); filesize = lseek(input, 0, SEEK_END); lseek(output, filesize-1, SEEK_SET); write(output, &endchar, 1); if((source = mmap(0, filesize, PROT_READ, MAP_SHARED, input, 0)) == (void *)-1) { fprintf(stderr, "Errore durante il mapping del primo file\n"); exit(1);

Esempio: memory mapped file copy (III) if((target = mmap(0, filesize, PROT_WRITE, MAP_SHARED, output, 0)) == (void *)-1) { fprintf(stderr, "Errore durante il mapping del secondo file\n"); exit(2); memcpy(target, source, filesize); munmap(source, filesize); munmap(target, filesize); close(input); close(output); exit(0);

Esercizi Scrivere un programma che riporta le modifiche di dimensione di un file (specificato come primo argomento sulla riga di comando) nell arco di un intervallo di tempo (specificato in secondi come secondo argomento sulla linea di comando). Alla fine il programma deve produrre sullo schermo del terminale un istogramma delle modifiche (si utilizzi ad esempio il carattere *). Scrivere un programma che copia il primo file passato come argomento sulla linea di comando nel file passato come secondo argomento, utilizzando le chiamate di sistema open, read e write. Si confrontino le prestazioni di questo programma con quelle di copyfile.c che sfrutta il memory mapped I/O.