[successivo] [precedente] [inizio] [fine] [indice generale] [parte]
Questo capitolo introduce le funzioni di I/O sui file. Queste sono diverse da quelle standard basate su puntatori, in quanto sfruttano, al loro posto, un descrittore generico.
Con questo approccio è possibile trattare anche dispositivi come porte seriali e console utilizzando il descrittore generico.
I descrittori dei file vengono memorizzati in una variabile intera che rappresenta un indice nella tabella completa dei file aperti. Solo agli interi 0, 1 e 2 sono assegnati ai dispostivi speciali stdin, stdout e stderr.
Tabella 9.1. Funzioni POSIX per file e directory.
Prototipo | Descrizone |
int open (char*, int, ...); | Apre un file. |
int close (int); | Chiude un file. |
ssize_t read (int, void*, size_t); | Legge i dati da un file. |
ssize_t write (int, void*, size_t); | Scrive i dati in un file. |
off_t lseek (int, off_t, int); | Imposta la posizione corrente di lettura o scrittura nel file. |
Il listato 9.1 apre un file in sola scrittura con l'utilizzo della funzione open(). Il primo parametro formale della funzione e' il nome del file completo di percorso; il secondo è un flag e deve essere O_WRONLY (sola scrittura), O_RDONLY (sola lettura) o O_RDWR (lettura e scrittura).
Un'operazione di OR bit a bit può essere eseguita con i valori di tabella 9.2.
L'ultimo parametro formale è opzionale ed indica i permessi sui file con i valori di tabella 9.3.
La funzione open ha come parametro di ritorno un numero che rappresenta il descrittore del file.
Se il numero è -1 allora si è verificato un errore che viene memorizzato nella variabile errno.
La funzione close() chiude il file ed accetta come unico parametro formale il descrittore stesso.
Tabella 9.2. Flag per la funzione open.
Flag | Descrizone |
O_CREAT | Se il file non esiste viene creato. Il possessore è lo stesso proprietario del processo; il gruppo rappresenta o quello dell'utente o quello della directory dove il file viene memorizzarto. |
O_EXCL | Viene combinato con O_CREAT; se il file esiste ritorna un'errore. |
NO_CTTY | Se il percorso è riferito ad un terminale, l'utente non diventa proprietario del file. |
O_TRUNC | Se il file esiste e viene aperto in scrittura allora la lunghezza viene impostata a zero. Se il file è un dispositivo il flag viene ignorato. |
O_APPEND | Il puntatore del file viene posizionato alla fine; i nuovi dati vengono aggiunti in coda. |
O_NONBLOCK | Se possibile il file viene aperto in modalità non bloccante. |
O_SYNC | Il file viene aperto in modalità sincrona in lettura e scrittura. |
O_NOFOLLOW | Se il percorso è un link l'operazione termina con un errore. |
O_DIRECTORY | Se il percorso non è una directory l'operazione termina con un errore. |
O_LARGEFILE | Nei sistemi a 32 bit che prevedono file system di ampie dimensioni, non consente di rappresentare le dimensioni dei file a 31 bit. |
Tabella 9.3. Flag per assegnare i permessi sui file con la funzione open.
Flag | Descrizone |
S_IRWXU | Permessi in lettura, scrittura ed esecuzione per l'utente. |
S_IRUSR | Permesso in lettura per l'utente. |
S_IWUSR | Permesso in scrittura per l'utente. |
S_IXUSR | Permesso in esecuzione per l'utente. |
S_IRWXG | Permessi in lettura, scrittura ed esecuzione per il gruppo. |
S_IRGRP | Permesso in lettura per il gruppo. |
S_IWGRP | Permesso in scrittura per il gruppo. |
S_IXGRP | Permesso in esecuzione per il gruppo. |
S_IRWXO | Permessi in lettura, scrittura ed esecuzione per il gruppo. |
S_IROTH | Permesso in lettura per gli altri utenti. |
S_IWOTH | Permesso in scrittura per gli altri utenti. |
S_IXOTH | Permesso in esecuzione per gli altri utenti. |
#define _GNU_SOURCE #include <unistd.h> #include <limits.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #include <errno.h> int main() { int fd, count; char* data = "Questo e' un file di prova.\n"; /* crea un file in sola scrittura */ fd = open( "data.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR ); if( fd == - 1 ) { printf( "%s\n", strerror( errno ) ); exit( -1 ); } /* memorizza la stringa sul file */ count = write( fd, data, strlen( data ) ); if( count == -1 ) { printf( "%s\n", strerror( errno ) ); exit( -1 ); } close( fd ); exit( 0 ); } |
La funzione write() accetta tre parametri formali: il descrittore del file, il puntatore ai dati e il numero di byte da memorizzare.
Il valore di ritorno è un intero che rappresenta la quantità di byte scritti; ritorna il valore -1 se si è verificato un errore.
#define _GNU_SOURCE #define BUF_SIZE 256 #include <unistd.h> #include <limits.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #include <errno.h> int main() { int fd, count; char data[ BUF_SIZE ]; /* crea un file in sola scrittura */ fd = open( "data.txt", O_RDONLY); if( fd == - 1 ) { printf( "%s\n", strerror( errno ) ); exit( -1 ); } /* memorizza la stringa sul file */ count = read( fd, data, BUF_SIZE ); if( count == -1 ) { printf( "%s\n", strerror( errno ) ); exit( -1 ); } printf( "%s", data ); close( fd ); exit( 0 ); } |
In listato 9.2 vengono letti i primi 256 byte dei dati contenuti nel file data.txt
. La funzione read() è analoga alla funzione write() tuttavia memorizza nell'array data il contenuto del file.
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome funzioni_su_file_e_directory.html