Successivo: , Su: Esempio di estensione   [Contenuti][Indice]


17.6.1 Usare chdir() e stat()

Questa sezione mostra come usare le nuove funzioni a livello di awk una volta che siano state integrate nell’interprete del programma gawk in esecuzione. Usare chdir() è molto semplice. Richiede un solo argomento, la nuova directory su cui posizionarsi:

@load "filefuncs"
…
newdir = "/home/arnold/funstuff"
ret = chdir(newdir)
if (ret < 0) {
    printf("non riesco a passare a %s: %s\n", newdir, ERRNO) > "/dev/stderr"
    exit 1
}
…

Il valore restituito è negativo se la chiamata a chdir() non è riuscita, ed ERRNO (vedi la sezione Variabili predefinite) è impostato a una stringa che descrive l’errore.

Usare stat() è un po’ più complicato. La funzione scritta in C stat() riempie una struttura che ha una certa quantità di informazioni. La maniera corretta per immagazzinarle in awk è quella di riempire un vettore associativo con le informazioni appropriate:

file = "/home/arnold/.profile"
ret = stat(file, fdata)
if (ret < 0) {
    printf("non è stato possibile eseguire stat per %s: %s\n",
             file, ERRNO) > "/dev/stderr"
    exit 1
}
printf("dimensione di %s è %d byte\n", file, fdata["size"])

La funzione stat() svuota sempre il vettore che contiene i dati, anche nel caso che la chiamata a stat() non riesca. I seguenti elementi vengono restituiti dalla funzione:

"name"

Il nome del file oggetto della chiamata a stat().

"dev"
"ino"

I numeri di device e di inode, rispettivamente.

"mode"

Il modo del file, in formato numerico. Questo include sia il tipo di file che i suoi permessi di accesso.

"nlink"

Il numero di collegamenti fisici del file (stesso file con diversi nomi).

"uid"
"gid"

Gli identificativi di utente e di gruppo del possessore del file.

"size"

La dimensione in byte del file.

"blocks"

Il numero di blocchi su disco realmente occupati dal file. Questo può non essere proporzionale alla dimensione del file se il file ha delle lacune [ossia se solo alcune parti del file esistono veramente, il resto non è ancora stato riempito].

"atime"
"mtime"
"ctime"

La data e ora dell’ultimo accesso, modifica, e aggiornamento dell’inode, rispettivamente. Questi sono delle marcature temporali numeriche (misurate in secondi dal 01 gennaio 1970), che possono essere formattate dalla funzione strftime() (vedi la sezione Funzioni per gestire marcature temporali).

"pmode"

La modalità stampabile (“printable mode”) del file. Questo è una stringa che rappresenta il tipo del file e i permessi di accesso, come sono visualizzati da ‘ls -l’—per esempio, "drwxr-xr-x".

"type"

Una stringa stampabile che descrive il tipo di file. Il valore è uno dei seguenti:

"blockdev"
"chardev"

Il file è un dispositico a blocchi o a caratteri (“file speciale”).

"directory"

Il file è una directory.

"fifo"

Il file è una pipe denominata (nota anche come FIFO [First In First Out]).

"file"

Il file è un file normale.

"socket"

Il file è un socket AF_UNIX (“Unix domain”) nel filesystem.

"symlink"

Il file è un collegamento simbolico.

"devbsize"

La dimensione di un blocco per l’elemento indicizzato da "blocks". Questa informazione è derivata dalla costante DEV_BSIZE definita in <sys/param.h> nella maggior parte dei sistemi, o dalla costante S_BLKSIZE in <sys/stat.h> nei sistemi BSD. Per alcuni altri sistemi il valore si basa su una conoscenza a priori delle caratteristiche di un particolare sistema. Se non si riesce a determinare il valore, viene restituito quello di default, che è 512.

Possono essere presenti diversi altri elementi, a seconda del sistema operativo e del tipo di file. Si può controllarne la presenza dal programma awk per mezzo dell’operatore in (vedi la sezione Come esaminare un elemento di un vettore):

"blksize"

La dimensione preferita di un blocco per effettuare operazioni di I/O sul file. Questo campo non è presente nella struttura C stat di tutti i sistemi che rispettano lo standard POSIX.

"linkval"

Se il file è un collegamento simbolico, questo elemento è il nome del file puntato dal collegamento simbolico (cioè, il valore del collegamento).

"rdev"
"major"
"minor"

Se il file è un dispositivo a blocchi o a caratteri, questi valori rappresentano il numero del dispositivo e, rispettivamente, le componenti principale e secondaria di quel numero.


Successivo: , Su: Esempio di estensione   [Contenuti][Indice]