next up previous contents index return to home!
Next: Strutture dati coinvolte Up: Il File System di Previous: Files   Indice   Indice analitico

La libreria Posix per i file

In questa sezione e nelle seguenti, descriveremo la libreria standard POSIX per operare sui file.

Un descrittore di file è un intero non negativo che individua un file aperto da un processo. Ogni processo possiede una tabella dei descrittori che associa ogni descrittore aperto per il processo a un file. Di solito, il descrittore 0 corrisponde al file di standard input, il descrittore 1 al file di standard output e il descrittore 2 al file di standard error. Per esigenze di standardizzazione, POSIX definisce le macro STDIN_FILENO, STDOUT_FILENO e STDERR_FILENO per questi 3 descrittori, di modo che, se nel futuro questi 3 identificatori dovessero assumere altri valori, i vecchi programmi potrebbero essere ancora usati senza modifiche, dopo una ricompilazione.

La funzione open() apre un file:



#include<sys/types.h>
#include<sys/stat.h>
#include<fnctl.h>

int open(const char *pathname, int oflag, ...);


Il parametro oflag stabilisce la modalità di apertura del file ed è l'OR tra i valori elencati in tabella 3.1. Vale la pena di fare alcune considerazioni:


Tabella 3.1: flags per la open().
Macro Modalità
O_RDONLY solo in lettura
O_WRONLY solo in scrittura
O_RDWR in lettura/scrittura
O_APPEND in append
O_CREAT crea il file se non esiste
O_EXCL chiudi in caso di exec
O_TRUNC tronca la lunghezza del file a 0
O_NONBLOCK le operazioni sono non bloccanti
O_SYNC la write non ritorna finchè il dato non è
  effettivamente scritto sul disco.


Per leggere e scrivere da un file si usano le primitive read e write:



#include<unistd.h>

ssize_t read(int filedes, void *buff, size_t nbytes);
ssize_t write(int filedes, const void *buff, size_t nbytes);


Entrambe ritornano il numero effettivo di bytes letti/scritti. Infine, la funzione lseek() consente di spostare il puntatore corrente del file in una posizione qualunque:



#include<sys/types.h>
#include<unistd.h>

off_t lseek(int filedes, off_t offset, int whence);


Il parametro offset può assumere come valori che vengono interpretati a seconda del parametro whence, come elencato in tabella 3.2; la funziona ritorna la posizione assoluta raggiunta dopo il compimento dell'opearazione.


Tabella 3.2: flags per la lseek().
Macro Modalità
SEEK_SET spostati a offset bytes dall'inizio del file
SEEK_CUR spostati a offset bytes dalla posizione corrente
SEEK_END spostati a offset bytes dalla posizione finale


Per esempio, la seguente istruzione:

currpos = lseek(fd,0,SEEK_END);

sposta il puntatore al file indicato dal descrittore fd alla fine.


next up previous contents index
Next: Strutture dati coinvolte Up: Il File System di Previous: Files   Indice   Indice analitico
Giuseppe Lipari 2002-10-27