Sei sulla pagina 1di 54

Il File-System

I direttori in ambiente Linux


Stefano Quer
Dipartimento di Automatica e Informatica
Politecnico di Torino
Sistemi Operativi – Stefano Quer 2

Direttori

 Nessun sistema di memorizzazione contiene un


unico file
 I file sono organizzati in direttori
 Un direttorio è un nodo (di albero) o vertice (di
grafo) contenente informazioni sugli elementi in
esso contenuti
 Direttori e file risiedono entrambi su memoria di
massa
 Su un direttorio sono effettuabili operazioni simili
a quelle dei file
 Creazione, cancellazione, elenco del contenuto, ri-
denominazione, visita, ricerca, etc.
Sistemi Operativi – Stefano Quer 3

Struttura

 La struttura di un direttorio dipende da ragioni di


 Efficiency (efficienza)
 Velocità nel manipolare il file system, e.g.,
localizzare un file
 Naming (convenienza)
 Semplicità per un utente di identificare i propri file
 Evitare che lo stesso nome attribuito a più file crei
problemi
 Grouping (organizzazione)
 Raggruppare le informazioni in base alle relative
caratteristiche
● Programmi di editing, compilatori, giochi, etc.
Sistemi Operativi – Stefano Quer 4

Direttori a un livello

 La struttura più semplice è quella a livello singolo


 Tutti i file del file system sono contenuti
all’interno dello stesso direttorio
 I file sono differenziati dal solo nome
 Ciascun nome deve essere univoco all’interno
dell’intero file system
Directory entry

File (dati)
Sistemi Operativi – Stefano Quer 5

Direttori a un livello

 Per ciascun file si evidenziano


 La directory entry: individua il nome e
eventualmente altre informazioni del file
 I dati: separati dalla directory entry, sono da essa
individuati tramite puntatore

Directory entry

File (dati)
Sistemi Operativi – Stefano Quer 6

Direttori a un livello

 Prestazioni
 Efficiency
 Struttura facilmente comprensibile e gestibile
 Gestione del file system semplice ed efficiente
 Naming
 I file devono avere nomi univoci
 Presenta limiti evidenti all’aumentare del numero di
file memorizzati
 Grouping
 La gestione dei file di un utente singolo è complessa
 La gestione di utenti multipli è praticamente
impossibile
Sistemi Operativi – Stefano Quer 7

Direttori a due livelli

 I file sono contenuti in un albero a due livelli


 Ogni utente può avere il proprio direttorio
 Ogni user ha la sua home directory
 Tutte le operazioni sono eseguite solo sulla home
corretta Directory entry
Direttorio principale della home di
(utenti) user n

Directory entry
della home di
File (dati)
user 1
Sistemi Operativi – Stefano Quer 8

Direttori a due livelli

 Prestazioni
 Efficiency
 Visione del file-system "user oriented"
 Ricerche semplificate e efficienti agendo su utenti
singoli
 Naming
 È possibile avere file con lo stesso nome purchè
appartenenti a utenti diversi
 Occorre specificare un path-name per ogni file
 Grouping
 Semplificato tra utenti diversi
 Complesso per ciascun utente singolo
Sistemi Operativi – Stefano Quer 9

Direttori ad albero

 Generalizza i precedenti
 I file sono contenuti in un albero
 Ogni nodo/vertice può contenere come entry un
altro nodo/vertice dell’albero
tutti i direttori
gestitiallo
vengono
stessomodo

nessunelementopuò
esserecondiviso

i
innateduplicare
i file
Sistemi Operativi – Stefano Quer 10

Direttori ad albero

 Ogni utente può gestire tanto file quanto direttori


e sotto-direttori
 Nascono i concetti di working directory, cambio
direttorio, path assoluto e relativo, etc.
 Prestazioni Concetti analizzati
nella parte
 Efficiency sperimentale Linux

 Ricerche vincolate alla struttura ad albero e quindi


alla sua profondità e ampiezza
 Naming
 Permesso in maniera estesa
 Grouping
 Permesso in maniera estesa
Sistemi Operativi – Stefano Quer 11

Direttori a grafo aciclico

 File system a albero non permettono la


condivisione di informazioni
 Spesso è utile individuare lo stesso oggetto con
nomi diversi
 Da parte dello stesso utente con path diversi
 Da parte di utenti diversi
 Si osservi che la duplicazione delle informazioni
(copia) non risolve tale problema a causa di
3semodificol'originale
 Aumento dello spazio occupato dal file system lacopiarimane
 Coerenza delle informazioni presenti nelle varie invariata
copie
Sistemi Operativi – Stefano Quer 12

Direttori a grafo aciclico

 I file system a grafo orientato aciclico (cioè senza


cicli)
 Permettono di condividere informazioni,
rendendola visibile con path diversi

Elemento condiviso
Sistemi Operativi – Stefano Quer 13

Direttori a grafo aciclico

 La presenza di link aumenta la difficoltà di


gestione dei file system
 Occorre distinguire gli oggetti nativi dai relativi
collegamenti in fase di creazione, manipolazione e
cancellazione
 Creazione
 La condivisione di una entry può essere ottenuta in
diversi modi
 Nei sistemi UNIX-like la strategia standard è quella hardlink fisico
della creazione di collegamenti o link softlink logico
● Un link è un riferimento (puntatore) a un’altra entry
(pre-esistente)

riferimentoindirettoad unoggetto
Sistemi Operativi – Stefano Quer 14

Direttori a grafo aciclico

 Visita e ricerca
 Se la entry è un link occorre accorgersene e
effettuare un indirizzamento indiretto, ovvero
"risolvere" il collegamento, utilizzandolo per
raggiungere l’entry originaria
 Tramite link ogni entry del file system può essere
raggiungibile con più path assoluti (e con nomi
diversi)
assoluto cieli ● Analisi del file system (statistiche, e.g., quanti file di
path
più estensione ".c" sono presenti?) diventano molto più
complesse
Sistemi Operativi – Stefano Quer 15

Direttori a grafo aciclico

 Cancellazione
 Occore stabilire come gestire il link e come gestire
l’oggetto riferito
● La cancellazione di un link in genere viene effettuata
in maniera immediata e non influisce sull’oggetto
originale
● Occorre però decidere come effettuare la
cancellazione dell’oggetto
o Se si cancella l’oggetto che cosa si fa dei link che lo
problemi riferiscono?
o Quando si riutilizza lo spazio ad esso riservato?
Sistemi Operativi – Stefano Quer 16

Direttori a grafo aciclico

 Cancellazione immediata dei dati


solosoftlink
● È possibile lasciare dei link pendenti (dangling)
Soft-link UNIX ● Quando si cercherà di utilizzare il link in futuro ci si
accorgerà che il file riferito è scomparso
 Cancellazione dei dati alla cancellazione dell’ultimo link
● Per evitare link pendenti occorre tenerne traccia, ovvero
Hard-link UNIX occorre gestire la presenza di oggetti e link multipli
o Mantenere l’elenco di tutti i link è costoso (lista di
lunghezza variabile) listadeilink non
o Cancellare tutti i link (le entry) alla cancellazione convenientepercosa
dell’oggetto è costoso, in quanto occorrerebbe ricercarli dimemoria ericerca
● Conviene memorizzare solo il contatore (numero di link)
Comando o Nei sistemi UNIX tale contatore viene memorizzato negli i-
“ls –i” node
vienememorizzato
o Esso viene incrementato e decrementato in maniera soloil numero diun
opportuna
di unoggetto cantato
soloquando il
contatore va a 0 l'entitàfisica
vienecancellata la esce ilnumero
deicimadiogni
file
Sistemi Operativi – Stefano Quer 17

Direttori a grafo aciclico

 Inoltre la creazione di un link a un direttorio


potrebbe causare la nascita di un ciclo nel file
system
 La gestione di un grafo ciclico richiede operazioni di
maggiore complessità
● Un comando di ricerca o di visita dovrebbe verificare
la presenza di cicli per evitare ricorsioni infinite
 Tra le possibili strategie la più semplice è non
permette la creazione di link a direttori

mossamigliore
interno al directory ciè
www.T
direttorio
linkoun
il link punta
ciclo ai link c
aldirectory
Sistemi Operativi – Stefano Quer 18

Direttori a grafo ciclico

 L’alternativa al grafo aciclico e quella del grafo


ciclico ovvero occorre
 Permettere la creazione di cicli
 Gestire opportunamente i cicli esistenti in tutte le fasi

Presenza di un
ciclo
Sistemi Operativi – Stefano Quer 19

Direttori a grafo ciclico

 La gestione può essere effettuata con diversi


approcci che dovrebbero tenere conto di diverse
problematiche
 Un elemento potrebbe auto-referenziarsi e non
essere mai cancellato e/o rilevato
maledetto
 La gestione più semplice consiste nel non visitare
mai i link (oppure sotto-categorie dei link)
Sistemi Operativi – Stefano Quer 20

Allocazione

 Per allocazione si intendono le tecniche di allocazione


alivellologico
utilizzo dei blocchi dei dischi per la n fisico
memorizzazione di file noi cioccupiamo
 Non ci occuperemo della struttura delle unità di dell'allocazione a livlog
memorizzazione
 In ogni caso tali unità possono essere viste come
un insieme indicizzabile lineare (vettore) di blocchi
 Metodologie di allocazione principali
 Contigua (contiguous) Fat locazioneconcatenata
 Concatenata (linked) usatadago.iesystempiù
1
piùusata  Indicizzata (indexed)
Sistemi Operativi – Stefano Quer 21

Allocazione contigua

 Ogni file occupa un insieme contiguo di blocchi

Per ciascun file il direttorio


specifica l’indirizzo del
primo blocco (b) e la
lunghezza del file (n)

Il file occupa i blocchi


b, b+1, b+2, … , b+n-1

Ogni file presenta


frammentazione interna
0 (ultimo blocco
parzialmente occupato)

vieneoccupato
sempreilblocco
intero
bloccougualmenteoccupatoalmassimo
es file 1kbyte
blocco
4kbyte
Sistemi Operativi – Stefano Quer 22

Allocazione contigua

 Vantaggi
 Strategia di allocazione molto semplice
 Per ogni file si memorizzano poche informazioni
 Permette accessi sequenziali immediati
 Ogni blocco si trova dopo il precedente e prima del
successivo
 Permette accessi diretti semplici
 L’i-esimo blocco a partire dal blocco b si trova
all’indirizzo b+i-1
Sistemi Operativi – Stefano Quer 23

Allocazione contigua
Occorre ricercare uno spazio
 Svantaggi libero di dimensione sufficiente

 Occorre decidere la politica di allocazione


interna necessario unospazio
frammentazione  Dove vengono allocati i file nuovi?
es file di 1
Kbe bloccodi4h ● Algoritmi di first-fit, best-fit, worst-fit, etc.
contiguo abbastanza
grandeperilnuovofile
frammentazioneinterna
Kb di ● Come è possibile determinare lo spazio necessario?
 Nessun algoritmo di allocazione risulta privo di
e 5.0 devequindiblocchidifetti quindi la tecnica spreca spazio
mediaretragrandezza
nonutilizzate
e quantità  Tale spreco è noto come frammentazione blocchiliberi isolamento
causa
esterna (insieme dei blocchi non utilizzati)
soluzione  Possibile la ri-compattazione (on-line e off-line)
aeroina
esterna  Problemi di allocazione dinamica costolinearedella
rocca inAPA
velocizza il  I file non possono crescere liberamente in quanto lo
sistemaoperativo spazio disponibile è limitato dal file successivo
quest'operazione ie chevarianospesso dilunghezza
grossoproblemaper e
ma
ovviamenteha uncosto
1
possorisolvere con Allocazione concatenata
Sistemi Operativi – Stefano Quer 24

Allocazione concatenata

 Ogni file può essere allocato gestendo una lista


concatenata di blocchi
Il direttorio contiene un
puntatore al primo e uno
all’ultimo blocco del file

Ogni blocco contiene un


6 5 puntatore al blocco
successivo

importante non hopiù


fiammaesterna
I blocchi di ciascun file sono
sparsi per l’intero disco
possofinalmenteallocare
praticamente creouna lista dimemoria dinamicamente
necessito i file e non
più dicomplessi algoritmi
ogniblocco punta al successivo nella lista
Sistemi Operativi – Stefano Quer 25

Allocazione concatenata
j
 Vantaggi
 Risolve i problemi dell’allocazione contigua
 Permette l’allocazione dinamica dei file
 Elimina la frammentazione esterna
 Evita l’utilizzo di algoritmi di allocazione complessi
Sistemi Operativi – Stefano Quer 26

Allocazione concatenata

 Svantaggi
 Ogni lettura implica un accesso sequenziale ai
blocchi 1
 Risulta efficiente solo per accessi sequenziali
 Un accesso diretto richiede la lettura di una catena
di puntatori sino a raggiungere l’indirizzo desiderato
 Ogni accesso a un puntatore implica una operazione
di lettura dell’intero blocco
costo dispazio
 La memorizzazione dei puntatori maggior
dato puntatorenext
 Richiede spazio
un bloccoperdo
seperdo blocchi
 È critica dal punto di vista dell’affidabilità tutti i
successivi
 Rende lo spazio utile minore di
critico
● Lo spazio disponibile non è più una potenza di 2
Sistemi Operativi – Stefano Quer 27

Allocazione concatenata: FAT variante


Sposta i puntatori
 L’allocazione utilizzata da MS-DOS dai vari blocchi a
un blocco specifico
 È basata su FAT (File Allocation Table)
 È una variante del metodo di allocazione risolviamo i problemidi
concatenato affidabilità
 Il blocco degli indici contiene la FAT
 Tabella con un elemento per ciascun blocco
presente sul disco
 La sequenza dei blocchi appartenenti a un file è
individuata a partire dalla directory mediante
 Elemento di partenza del file nella FAT
 Sequenza di puntatori presenti (direttamente) nella
FAT (non più nei blocchi)
Sistemi Operativi – Stefano Quer 28

Allocazione concatenata: FAT

 I riferimenti non sono memorizzati nei blocchi su


disco ma direttamente negli elementi della FAT
 La lettura di ogni blocco richiede due accessi a maggiorcostocomputazione
disco il disco
richiede doppio
degli
accessi
 Il primo accesso su
viene effettuato
alla FAT
 Il secondo, al blocco
dati Directory
entry

FAT
Sistemi Operativi – Stefano Quer 29

Allocazione concatenata: FAT

 Limiti
 Accesso lento ildoppiodiaccessi porcoddio

 L’affidabiità è critica (persa la FAT si perde tutto) tuttoildiscodiventa


aggiornabile
 La dimensione tranne
il bloccodellat.se
della FAT è critica persoquelloperdiamo
tutto

Directory
entry

FAT
Sistemi Operativi – Stefano Quer 30

Allocazione indicizzata

 Per permettere un accesso diretto efficiente è


possibile inglobare tutti i puntatori in una tabella
di puntatori
 Tale tabella di puntatori è solitamente denominata
blocco indice o index-node (i-node)
 Ogni file ha la sua tabella, ovvero un vettore di
indirizzi dei blocchi in cui il file è contenuto
 L’i-esimo elemento del vettore individua l’i-esimo
blocco del file
Sistemi Operativi – Stefano Quer 31

Allocazione indicizzata
Il direttorio contiene il solo
puntatore al blocco indice

Non è una FAT perchè i


puntatori sono tutti in
sequenza (non si ha una
lista di puntatori)
Sistemi Operativi – Stefano Quer 32

Allocazione indicizzata

 Rispetto all’allocazione concatenata occorre


sempre allocare un blocco indice bloccoindica
sehoun notano
 Blocchi indice di dimensione ridotta permettono di troppogrande
non sprecare troppo spazio grammiintera
setroppopiccolo
nonposso ancor
 Blocchi indice di dimensione elevata aumentano in dinamicamente
numero di riferimenti inseribili nel blocco indice
 In ogni caso occorre gestire la situazioni il cui il
blocco indice non è sufficiente a contenere tutti i
puntatori ai blocchi del file
 Esistono diversi schemi
● A blocchi indice concatenati
● A blocchi indice a più livelli
● Combinato
Schema UNIX/Linux
Sistemi Operativi – Stefano Quer 33

Allocazione indicizzata: schema combinato

 Lo schema combinato è utilizzato nei sistemi


UNIX/Linux
 A ogni file è associato un blocco detto i-node
 Ogni i-node contiene diverse informazioni tra cui
15 puntatori ai blocchi dati del file
 I primi 12 puntatori sono puntatori diretti, ovvero
puntano a blocchi dei file
 I puntatori 13, 14 e 15 sono puntatori indiretti, con
livello di indirizzamento crescente
● Il blocco individuato non contiene i dati ma i puntatori
(i puntatori ai puntatori) [i puntatori ai puntatori ai
puntatori] a blocchi di dati del file
Sistemi Operativi – Stefano Quer 34

Allocazione indicizzata: schema combinato

iosonodirette
Ricordare
comandi disolitoiprimi
"ls –la" 13 indiretto
e "ls –i" vi indirettodoppio
is indirettotriplo
ecosivia
Il puntatore 14 è di tipo
indiretto doppio

Con puntatori a 64 bit si


Il puntatore 13 è di Il puntatore 15 è di memorizzano file sino a
tipo indiretto singolo tipo indiretto triplo 260 byte (exabyte)
Sistemi Operativi – Stefano Quer 35

Allocazione indicizzata: schema combinato


nonhocapitoun
casostavo al
slegano

Hard-link

Un direttorio è una tabella che associa a ogni nome di file un i-node number
Il link da un direttorio al rispettivo i-node è detto hard-link
Lo stesso i-node number può essere individuato da più link
Sistemi Operativi – Stefano Quer 36

Allocazione indicizzata: schema combinato

Record di lunghezza fissa che contiene la maggior


parte di informazioni relative ai file (i.e., ne L’i-node number corrisponde
identifica i blocchi che lo compongono) all’indice di una tabella in cui
Contiene un contatore che individua il numero di ogni elemento è un i-node e
puntatori (link) contiene le informazioni di un
Numerati a partire da 1; alcuni sono riservati al SO file
Sistemi Operativi – Stefano Quer 37

Allocazione indicizzata: schema combinato

 Hard link (link effettivo o fisico)


 Directory entry che punta a un i-node
 Non esistono hard link
 Verso direttori (evita filesystem a grafo ciclico)
 Verso file su altri file system
 Un file è fisicamente rimosso solo quando tutti i
suoi hard link sono stati rimossi
 Soft link (link simbolico)
 Il blocco dati individuato dall’i-node punta a un
blocco che contiene il path name del file
 Sostanzialmente è un file che come unico blocco
dati ha il nome di un altro file
Sistemi Operativi – Stefano Quer 38

Filesystem UNIX: Un esempio

il direttorio si
autoindividua
hadlivecantare DIR PADRE
Directory entry del
2549 direttorio 1267
ti (nome ignoto)

e
riina
DIR FIGLIO
Directory entry
tris
di "2549 testdir"
edfiglio di1261

L’i-node 2549 è un sotto-direttorio foglia


Il suo hard link count è pari a 2
Uno deriva dal direttorio padre ("testdir") L’i-node "2549 testdir" è un
Uno deriva da se stesso ("testdir/.") sotto-direttorio foglia di 1267

ognidirettoriopadre ha 2 noouiukaogrisotxodirettoriop
senqnaz.nard
dafoglia
ognidieta
link cimaalpadre
rootnon ha unhard
Sistemi Operativi – Stefano Quer 39

Filesystem UNIX: Un esempio

Directory entry
di "2549 testdir"

Ogni sotto-
direttorio
incrementa
il numero
di link del
padre di 1 !

L’i-node 1267 è un direttorio con un sotto-direttorio


Il suo link count è pari almeno a 3
Uno deriva dal direttorio padre (non indicato)
Uno deriva da se stesso (".") L’i-node "2549 testdir" è un
Uno deriva dal direttorio figlio ("./testdir/..") sotto-direttorio foglia di 1267
Sistemi Operativi – Stefano Quer 40

Manipolazione del file system

 Lo standard POSIX mette a disposizione un


insieme di funzioni per effettuare la Struttura
manipolazione dei direttori dati
ritornata
systemcodedella  La funzione stat
libreriaPosix chehanno  Permette di capire di che tipo di "entry" si tratta
la
audiochepermettono (file, direttorio, link, etc.)
manipolazione di file  Tale operazione è permessa da una struttura C di
tipo struct stat
 Alcune altre funzioni di manipolazione Posizionamento
 getcwd, chdir

I.jo Yair
 mkdir, rmdir

eYehdir2
Creazione
 opendir, readdir, closedir cancellazione
scd Visita
getewdcsp.no
ugualialla
shell
Sistemi Operativi – Stefano Quer 41

stat ()
Path di cui Struttura
ritornare le dati
#include <sys/types.h> informazioni ritornata
#include <sys/stat.h>
principalmente
la vediamo
megiioora cifacapiredi
tipoè il g
int stat (const char *path, struct stat *sb);
che
int lstat (const char *path, struct stat *sb); cima
int fstat (int fd, struct stat *sb);
S

 La funzione stat restituisce il riferimento dalla


struttura sb (struct stat) per il file (o
descrittore) passato come parametro
 Valori di ritorno
 Il valore 0 se l’operazione ha avuto successo
 Il valore -1 se c’è errore
Sistemi Operativi – Stefano Quer 42

stat ()

 La funzione
 lstat restituisce informazioni sul link simbolico,
non sul file puntato dal link (quando il path
individua un link)
 fstat restituisce informazioni su un file già aperto
(riceve il descrittore del file invece del path)

int stat (const char *path, struct stat *sb);


int lstat (const char *path, struct stat *sb);
int fstat (int fd, struct stat *sb);
Sistemi Operativi – Stefano Quer 43

stat ()

struct stat {
mode_t st_mode; /* file type & mode */
ino_t st_ino; /* i-node number */
dev_t st_dev; /* device number */
dev_t st_rdev; /* device number */
...
}; Tipi primitivi

 Il secondo argomento di stat è il puntatore alla


struttura stat
 Il campo st_mode codifica il tipo di file
Sistemi Operativi – Stefano Quer 44

stat ()

struct stat {
mode_t st_mode; /* file type & mode */
ino_t st_ino; /* i-node number */
dev_t st_dev; /* device number */
dev_t st_rdev; /* device number */
...
};

 Alcune macro permettono di capire il tipo del file


 S_ISREG regular file, S_ISDIR directory,
S_ISBLK block special file, S_ISCHR character
special file, S_ISFIFO FIFO, S_ISSOCK socket,
S_ISLNK symbolic link
Sistemi Operativi – Stefano Quer 45

Esempio

struct stat buf; Permette di


... capire se si
tratta di un
if (stat(argv[i], &buf) < 0) {
direttorio !
fprintf (stdout, "lstat error.\n");
exit (1);
}
if (S_ISREG(buf.st_mode)) ptr = "regular";
else if (S_ISDIR(buf.st_mode)) ptr = "directory";
else if (S_ISCHR(buf.st_mode)) ptr = "char special";
else if (S_ISBLK(buf.st_mode)) ptr = "block special";
else if (S_ISFIFO(buf.st_mode)) ptr = "fifo";
else if (S_ISLNK(buf.st_mode)) ptr = "symbolic link";
else if (S_ISSOCK(buf.st_mode)) ptr = "socket";
printf("%s\n", ptr);
}
Sistemi Operativi – Stefano Quer 46

getcwd ()
Dimensione perevitareerroridi
#include <unistd.h>
di buf bufferoverflow
Get Current
char *getcwd (char *buf, int size); Working Directory

 Ottiene il path del direttorio di lavoro


 Valore di ritorno
 Il buffer buf se è OK; NULL se c’è errore
Sistemi Operativi – Stefano Quer 47

chdir ()

#include <unistd.h>
Change
int chdir (char *path); Directory

 Modifica il path del direttorio di lavoro


 Valori di ritorno
 Il valore 0 se è OK; il valore -1 se c’è errore
Sistemi Operativi – Stefano Quer 48

Esempio

#define N 100

char name[N];
codicedei
comandi if (getcwd (name, N) == NULL)
vistisopra fprintf (stderr, "getcwd failed.\n");
else
fprintf (stdout, "dir %s\n", name);

if (chdir(argv[1]) < 0)
fprintf (stderr, "chdir failed.\n");
else
fprintf (stdout, "dir changed to %s\n", argv[1]);
Sistemi Operativi – Stefano Quer 49

mkdir ()
Vedere system
#include <unistd.h> call open
#include <sys/stat.h>

int mkdir (const char *path, mode_t mode);

 Creano un nuovo direttorio (vuoto)


 Valore di ritorno
 Il valore 0 se è OK
 Il valore -1 se c’è errore
Sistemi Operativi – Stefano Quer 50

rmdir ()

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

int rmdir (const char *path);

 Cancellano un direttorio (se vuoto)


 Valori di ritorno
 Il valore 0 se è OK
 Il valore -1 se c’è errore
Sistemi Operativi – Stefano Quer 51

opendir (), dirent () e closedir ()

Apre un direttorio in lettura


#include <dirent.h> Valori di ritorno:
Il puntatore al direttorio se corretta
Il puntatore NULL in caso di errore
DIR *opendir (
const char *filename
);
Continua la lettura del direttorio
Valori di ritorno:
struct dirent *readdir ( Il puntatore al direttorio se corretta
Il puntatore NULL in caso di errore o al
DIR *dp
termine della lettura
);

int closedir ( Termina la lettura


DIR *dp Valori di ritorno:
); Il valore 0 se corretta
Il valore -1 in caso di errore
Sistemi Operativi – Stefano Quer 52

Struttura dirent

struct dirent {
inot_t d_no;
char d_name[NAM_MAX+1];
...
}

 La struttura struct dirent ritornata da readdir


 Ha formato che dipende dall’implementazione
 Contiene almeno i campi indicati
 Il numero di i-node
 Il nome del file (null-terminated)
Sistemi Operativi – Stefano Quer 53

Esempio
Struttura per lstat
#define N 100
... Directory "handle"
struct stat buf;
DIR *dp;
Struttura per readdir Richiesta
char fullName[N];
informazioni sul
struct dirent *dirp;
path in argv[1]
int i;
...
if (stat(argv[1], &buf) < 0 ) {
fprintf (stderr, "Error.\n"); exit (1); Se non è un
} direttorio termina
if (S_ISDIR(buf.st_mode) == 0) {
fprintf (stderr, "Error.\n"); exit (1);
In caso contrario
}
si apre il direttorio
if ( (dp = opendir(argv[1])) == NULL) {
fprintf (stderr, "Error.\n"); exit (1);
}
Sistemi Operativi – Stefano Quer 54

Esempio
Lettura direttorio
(iterando su tutte le entry)
i = 0;
while ( (dirp = readdir(dp)) != NULL) {
sprintf (fullName, "%s/%s", argv[1], dirp->d_name);
if (lstat(fullName, &buf) < 0 ) {
fprintf (stderr, "Error.\n"); exit (1);
}
if (S_ISDIR(buf.st_mode) == 0) {
fprintf (stdout, "File %d: %s\n", i, fullName);
} else {
fprintf (stdout, "Dir %d: %s\n", i, fullName);
}
i++; Richiesta
} Visualizzazione dati informazioni sulla
entry fullName
if (closedir(dp) < 0) {
fprintf (stderr, "Error.\n"); exit (1);
}
Chiusura e terminazione