[successivo] [precedente] [inizio] [fine] [indice generale] [parte]


Capitolo 9.   Funzioni su file e directory

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.

9.1   I descrittori

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.

9.2   Esempi di programmazione

9.2.1   open(), write(), read()

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.

Listato 9.1.

#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.

Listato 9.2.

#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

[successivo] [precedente] [inizio] [fine] [indice generale]