ATRIBUTS. GENERALITATS

Ja sabem què són els atributs d'un fitxer: tota aquella informació que emmagatzema el seu inode.

Per accedir als atributs d'un fitxer, primer cal conéixer un struct que serveix per a recollir-los. És l'struct stat i el trobarem definit al fitxer /usr/include/bits/stat.h. Un resum de la seva definició és aquest:

struct stat
{
__dev_t st_dev; /*Device.*/
unsigned short int __pad1;
__ino_t st_ino; /* File serial number. */
__mode_t st_mode; /* File mode. */
__nlink_t st_nlink; /* Link count. */
__uid_t st_uid; /* User ID of the file's owner. */
__gid_t st_gid; /* Group ID of the file's group.*/
__dev_t st_rdev; /* Device number, if device. */
unsigned short int __pad2;
__off_t st_size; /* Size of file, in bytes. */
__blksize_t st_blksize; /* Optimal block size for I/O. */
__blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */
struct timespec st_atim; /* Time of last access. */
struct timespec st_mtim; /* Time of last modification. */
struct timespec st_ctim; /* Time of last status change. */
__time_t st_atime; /* Time of last access. */
unsigned long int st_atimensec; /* Nscecs of last access. */
__time_t st_mtime; /* Time of last modification. */
unsigned long int st_mtimensec; /* Nsecs of last modification. */
__time_t st_ctime; /* Time of last status change. */
unsigned long int st_ctimensec; /* Nsecs of last status change. */
unsigned long int __unused4;
unsigned long int __unused5;
}

Pel que fa als tipus de les dades, no pararem atenció si no és imprescindible. Tot seguit, encara que tenim un comentari que ho explica, detallarem alguns dels atributs d'aquest struct. Hem de recordar que són les dades associades a algun arxiu.

st_ino: Número d'inode.
st_mode: Permisos i tipus de fitxer. No detallarem el seu contingut però sí el seu ús. Per saber el tipus de fitxer, hem de fer un AND de bits d'aquest camp amb la constant simbòlica S_IFMT i veuer si el resultat és un dels valors que podem trobar a /usr/include/sys/stat.h i que recollim tot seguit:

S_IFDIR Directori
S_IFCHR Dispositiu tipus caràcter
S_IFBLK Dispositiu tipus bloc
S_IFREG Arxiu ordinari
S_IFIFO Pipe amb nom
S_IFLNK Enllaç simbòlic
S_IFSOCK Socket

Si volem els permisos especials, podem fer un AND de bits amb S_ISUID pel bit setuid, S_ISGID pel setgid o S_ISVTX per a l'sticky bit, mentre que si volem saber els permisos ordinaris, disposem d'altres constants simbòliques:

S_IREAD S_IRUSR Lectura per a l'usuari propietari
S_IWRITE S_IWUSR Escriptura per a l'usuari propietari
S_IEXEC S_IXUSR Execució per a l'usuari propietari
S_IRWXU   Tots els permisos per a l'usuari propietari
S_IRGRP   Lectura per al grup propietari
S_IWGRP   Escriptura per al grup propietari
S_IXGRP   Execució per al grup propietari
S_IRWXG   Tots els permisos per al grup propietari
S_IROTH   Lectura per als demés
S_IWOTH   Escriptura per als demés
S_IXOTH   Execució per als demés
S_IRWXO   Tots els permisos per als demés

st_nlink: Nombre d'enllaços durs al fitxer.
st_uid: UID del propietari del fitxer.
st_gid: Identificador del grup propietari del fitxer.
st_size: Mida en bytes del fitxer.
st_atime: Data del darrer accés de lectura al fitxer.
st_mtime: Data de la darrera modificació del fitxer.
st_ctime: Data de la darrera modificació de les dades de l'inode del fitxer.

Aquestes tres darreres dates estan en segons a partir de l'1 de gener de 1970. Si les volem en nanosegons, cal fer ús dels tres camps homòlegs de tipus struc timespec:

struct timespec
{
__time_t tv_sec; /* Seconds. */
long int tv_nsec; /* Nanoseconds. */
};

Caldrà utilitzar les funcions de time.h (per exemple localtime) per traduir aquesta dada en un data intel·ligible.

Un cop analitzat l'struct stat, vegem quines són les funcions que ens poden retornar aquestes dades:

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

int stat (const char * nom_fitxer, struct stat * apbuffer);
int
fstat (int apfit, struct stat * apbuffer);
int
lstat (const char * nom_fitxer, struct stat * apbuffer);

La diferència entre stat i fstat és que fstat utilitza un fitxer obert prèviament. Pel que fa a lstat, serveix per accedir als inodes dels enllaços simbòlics (si féssim servir alguna de les altres, accediria al del fitxer al qual apunten).

Com és de suposar, si tot va bé, aquestes funcions omplen el buffer apuntat per apbuffer amb les dades del fitxer que se li passi, cas en que retornaran 0. Si hi ha problemes, retornen -1 i errno contindrà el codi de l'errada que s'hagi produït.

El següent programa mira d'extreure algunes de les dades associades a un fitxer:

Millora aquest programa fent-ne un que es digui informa i que accepti arguments per la línia de comandes.

 

 

Autor: Lluís València López

Creative Commons License
Aquesta obra està subjecta a una Llicència de Creative Commons.