Llamadas al Sistema (2)
13 mayo 1998
 

NOMBRE

stat, fstat, lstat - obtiene el estado de un fichero  

SINOPSIS

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

int stat(const char *file_name, struct stat *buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *file_name, struct stat *buf);  

DESCRIPCIÓN

Estas funciones devuelven información del fichero especificado. No se necesitan derechos de acceso al fichero para conseguir la información pero sí se necesitan derechos de búsqueda para todos los directorios del camino al fichero.

stat examina el fichero al que apunta file_name y llena buf.

lstat es idéntico a stat, solo que examina únicamente el enlace, no el fichero que se obtiene al seguir los enlaces.

fstat es idéntico a stat, pero sólo el fichero abierto apuntado por filedes (tal y como lo devuelve open(2)) es examinado en lugar de file_name.

Todos devuelven una estructura stat, que contien los siguientes campos:

struct stat
{
    dev_t         st_dev;      /* dispositivo */
    ino_t         st_ino;      /* inodo */
    mode_t        st_mode;     /* protección */
    nlink_t       st_nlink;    /* número de enlaces físicos */
    uid_t         st_uid;      /* ID del usuario propietario */
    gid_t         st_gid;      /* ID del grupo propietario */
    dev_t         st_rdev;     /* tipo dispositivo (si es
                                  dispositivo inodo) */
    off_t         st_size;     /* tamaño total, en bytes */
    unsigned long st_blksize;  /* tamaño de bloque para el
                                  sistema de ficheros de E/S */
    unsigned long st_blocks;   /* número de bloques asignados */
    time_t        st_atime;    /* hora último acceso */
    time_t        st_mtime;    /* hora última modificación */
    time_t        st_ctime;    /* hora último cambio */
};

El valor st_blocks da el tamaño del fichero en bloques de 512 bytes. El valor st_blksize da el tamaño de bloque "preferido" para operaciones de E/S eficientes sobre el sistema de ficheros. (Escribir en un fichero en porciones más pequeñas puede producir una secuencia leer-modificar-reescribir ineficiente).

No todos los sistemas de ficheros en Linux implementan todos los campos de hora. Por lo general, st_atime es cambiado por mknod(2), utime(2), read(2), write(2) y truncate(2).

Por lo general, st_mtime es cambiado por mknod(2), utime(2) y write(2). st_mtime no se cambia por modificaciones en el propietario, grupo, cuenta de enlaces físicos o modo.

Por lo general, st_ctime es cambiado al escribir o al poner información del inodo (p.ej., propietario, grupo, cuenta de enlaces, modo, etc.).

Se definen las siguientes macros POSIX para comprobar el tipo de fichero:

S_ISLNK(m)
es un enlace simbólico?
S_ISREG(m)
un fichero regular?
S_ISDIR(m)
un directorio?
S_ISCHR(m)
un dispositivo de caracteres?
S_ISBLK(m)
un dispositivo de bloques?
S_ISFIFO(m)
una tubería nombrada (fifo)?
S_ISSOCK(m)
un enchufe (socket)?

Se definen las siguientes banderas para el campo st_mode:

S_IFMT 0017000 máscara de bits para los campos de bit del tipo
de fichero (no POSIX)
S_IFSOCK 0140000 enchufe (no POSIX)
S_IFLNK 0120000 enlace simbólico (no POSIX)
S_IFREG 0100000 fichero regular (no POSIX)
S_IFBLK 0060000 dispositivo de bloques (no POSIX)
S_IFDIR 0040000 directorio (no POSIX)
S_IFCHR 0020000 dispositivo de caracteres (no POSIX)
S_IFIFO 0010000 fifo o tubería nombrada (no POSIX)
S_ISUID 0004000 poner bit UID
S_ISGID 0002000 poner bit GID
S_ISVTX 0001000 sticky bit (no POSIX)
S_IRWXU 00700 usuario (propietario del fichero) tiene permisos
de lectura, escritura y ejecución
S_IRUSR 00400 usuario tiene premiso de lectura (igual que
S_IREAD, que no es POSIX)
S_IWUSR 00200 usuario tiene premiso de escritura (igual que
S_IWRITE, que no es POSIX)
S_IXUSR 00100 usuario tiene premiso de ejecución (igual que
S_IEXEC, que no es POSIX)
S_IRWXG 00070 grupo tiene permisos de lectura, escritura y
ejecución
S_IRGRP 00040 grupo tiene permiso de lectura
S_IWGRP 00020 grupo tiene permiso de escritura
S_IXGRP 00010 grupo tiene permiso de ejecución
S_IRWXO 00007 otros tienen permisos de lectura, escritura y
ejecución
S_IROTH 00004 otros tienen permiso de lectura
S_IWOTH 00002 otros tienen permiso de escritura
S_IXOTH 00001 otros tienen permiso de ejecución

El bit SETGID (S_ISGID) tiene varios usos especiales: para un directorio, indica que se va a usar la semántica BSD para el directorio: los ficheros creados allí heredarán su GID del directorio, no del GID efectivo del proceso que crea cada fichero, y los directorios creados allí también tendrán el bit S_ISGID activo. Para un fichero que no tiene el bit de ejecución del grupo (S_IXGRP) activo, indica bloqueo obligatorio de ficheros/registros. El bit `sticky' (S_ISVTX) en un directorio significa que un fichero de ese directorio sólo puede ser renombrado o borrado por el propietario del fichero, por el propietario del directorio y por el superusuario.  

VALOR DEVUELTO

Se devuelve cero si hubo éxito. Si hubo error, se devuelve -1, y errno es actualizado apropiadamente.  

ERRORES

EBADF
filedes incorrecto.
ENOENT
No existe un componente del camino file_name o el camino es una cadena vacía.
ENOTDIR
Un componente del camino no es un directorio.
ELOOP
Se han encontrado demasiados enlaces simbólicos al recorrer el camino.
EFAULT
Dirección errónea.
EACCES
Permiso denegado.
ENOMEM
Fuera de memoria (es decir, memoria del núcleo).
ENAMETOOLONG
Nombre de fichero demasiado largo.
 

CONFORME A

Las llamadas stat y fstat conforman con SVr4, SVID, POSIX, X/OPEN y BSD 4.3. La llamada lstat conforma con 4.3BSD y SVr4. SVr4 documenta condiciones de error adicionales de fstat: EINTR, ENOLINK y EOVERFLOW. SVr4 documenta condiciones de error adicionales de stat y lstat: EACCES, EINTR, EMULTIHOP, ENOLINK y EOVERFLOW. El uso de los campos st_blocks y st_blksize puede ser poco portable. (Fueron introducidos en BSD. No están especificados por POSIX. La interpretación difiere entre sistemas y posiblemente en un mismo sistema cuando están involucrados montajes NFS).

POSIX no describe los bits S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO y S_ISVTX, pero en su lugar demanda el uso de las macros S_ISDIR(), etc. Unix V7 (y sistemas posteriores) tenían S_IREAD, S_IWRITE, S_IEXEC, donde POSIX prescribe los sinónimos S_IRUSR, S_IWUSR, S_IXUSR.  

OTROS SISTEMAS

Valores que han estado (o están) en uso en varios sistemas:

hex nombre ls octal descripción
f000 S_IFMT 170000 Máscara para el tipo de fichero
0000 000000 SCO: nodo-i fuera de servicio

 
BSD: tipo desconocido

 
SVID-v2 y XPG2: tienen tanto 0 como

 
0100000 para ficheros ordinarios
1000 S_IFIFO p| 010000 Fifo (tubería con nombre)
2000 S_IFCHR c 020000 V7: fichero especial de caracteres
3000 S_IFMPC 030000 V7: fichero especial de caracteres

 
multiplexados
4000 S_IFDIR d/ 040000 V7: directorio
5000 S_IFNAM 050000 XENIX: fichero especial con nombre

 
con dos subtipos, distinguidos

 
por los valores st_rdev 1, 2:
0001 S_INSEM s 000001 XENIX: subtipo semáforo de IFNAM
0002 S_INSHD m 000002 XENIX: subtipo datos compartidos
de IFNAM
6000 S_IFBLK b 060000 V7: fichero especial de bloques
7000 S_IFMPB 070000 V7: fichero especial de bloques

 
multiplexados
8000 S_IFREG - 100000 V7: fichero regular
9000 S_IFCMP 110000 VxFS: fichero comprimido
9000 S_IFNWK n 110000 HP-UX: fichero especial de red
a000 S_IFLNK l@ 120000 BSD: enlace simbólico
b000 S_IFSHAD 130000 Solaris: nodo-i sombra para ACL

 
(no visto por el espacio de usuario)
c000 S_IFSOCK s= 140000 BSD: conector (también "S_IFSOC" en VxFS)
d000 S_IFDOOR D 150000 Solaris: puerta
e000 S_IFWHT w% 160000 BSD: `whiteout'(no usado para nodos-i)
0200 S_ISVTX 001000 V7: `sticky bit': salvar el código
intercambiado incluso después de usarse

 
SVID-v2: reservado
SunOS: En ficheros no directorios: no
colocar en cache este fichero

 
SVID-v4.2: En directorios: opción de
elminación restringida
0400 S_ISGID 002000 V7: SETGID al ejecuctar
Para directorios: usar semántica BSD

 
para propagación del GID
0400 S_ENFMT 002000 SysV: Aplicar el bloqueo del fichero

 
(compartido con S_ISGID)
0800 S_ISUID 004000 V7: SETUID al ejecutar
0800 S_CDF 004000 HP-UX: el directorio es un fichero

 
dependiente del contexto

Una orden `sticky' apareción en AT&T UNIX Version 32V.

 

VÉASE TAMBIÉN

chmod

(2), chown(2), readlink(2), utime(2)

Nuevo comentario