Provided by:
manpages-es_1.55-10_all 
NOMBRE
stat, fstat, lstat - obtiene el estado de un fichero
SINOPSIS
#include <sys/types.h>
#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'ON
Estas funciones devuelven informacion del fichero especificado. No se
necesitan derechos de acceso al fichero para conseguir la informacion
pero si se necesitan derechos de busqueda para todos los directorios
del camino al fichero.
stat examina el fichero al que apunta file_name y llena buf.
lstat es identico a stat, salvo en caso de que se trate de un enlace
simbolico, en cuyo caso se examina el enlace mismo, no el fichero al
que hace referencia.
fstat es identico a stat, pero solo 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; /* proteccion */
nlink_t st_nlink; /* numero de enlaces fisicos */
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; /* tamano total, en bytes */
blksize_t st_blksize; /* tamano de bloque para el
sistema de ficheros de E/S */
blkcnt_t st_blocks; /* numero de bloques asignados */
time_t st_atime; /* hora ultimo acceso */
time_t st_mtime; /* hora ultima modificacion */
time_t st_ctime; /* hora ultimo cambio */
};
El valor st_size da el tamano del fichero (si es un fichero regular o
un enlace simbolico) en bytes. El tamano de un enlace simbolico es la
longitud del nombre de ruta que contiene, sin contar el caracter NUL
final.
El valor st_blocks da el tamano del fichero en bloques de 512 bytes.
(Este puede ser menor que st_size/512 p.e. cuando el fichero tenga
huecos.) El valor st_blksize da el tamano de bloque "preferido" para
operaciones de E/S eficientes sobre el sistema de ficheros. (Escribir
en un fichero en porciones mas pequenas puede producir una secuencia
leer-modificar-reescribir ineficiente).
No todos los sistemas de ficheros en Linux implementan todos los campos
de hora. Algunos tipos de sistemas de ficheros permiten el montaje de
tal manera que los accesos al fichero no provocan una actualizacion del
campo st_atime (Vea `noatime' en mount(8).)
El campo st_atime es modificado por accesos al fichero, p.e. por
execve(2), mknod(2), pipe(2), utime(2) y read(2) (de mas de cero
bytes). Otras rutinas, como mmap(2), pueden o no actualizar st_atime.
El campo st_mtime es modificado por cambios en el fichero, p.e. por
mknod(2), truncate(2), utime(2) y write(2) (de mas de cero bytes).
Ademas, el campo st_mtime de un directorio es modificado por la
creacion o borrado de ficheros en dicho directorio. El campo st_mtime
no es modificado por cambios en el propietario, grupo, contador de
enlaces duros, o modo.
El campo st_ctime es modificado por la escritura o por cambiar
informacion del inodo (es decir, propietario, grupo, contador de
enlaces, modo, etc.).
Se definen las siguientes macros POSIX para comprobar el tipo de
fichero:
S_ISLNK(m) es un enlace simbolico?
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 tuberia nombrada (fifo)?
S_ISLNK(m) un enlace simbolico? (No presente en POSIX.1-1996.)
S_ISSOCK(m) un conector (socket)? (No presente en POSIX.1-1996.)
Se definen las siguientes banderas para el campo st_mode:
S_IFMT 0017000 mascara de bits para los campos de bit del tipo
de fichero (no POSIX)
S_IFSOCK 0140000 conector (no POSIX)
S_IFLNK 0120000 enlace simbolico (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 tuberia 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 ejecucion
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 ejecucion (igual que
S_IEXEC, que no es POSIX)
S_IRWXG 00070 grupo tiene permisos de lectura, escritura y
ejecucion
S_IRGRP 00040 grupo tiene permiso de lectura
S_IWGRP 00020 grupo tiene permiso de escritura
S_IXGRP 00010 grupo tiene permiso de ejecucion
S_IRWXO 00007 otros tienen permisos de lectura, escritura y
ejecucion
S_IROTH 00004 otros tienen permiso de lectura
S_IWOTH 00002 otros tienen permiso de escritura
S_IXOTH 00001 otros tienen permiso de ejecucion
El bit SETGID (S_ISGID) tiene varios usos especiales: para un
directorio, indica que se va a usar la semantica BSD para el
directorio: los ficheros creados alli heredaran su GID del directorio,
no del GID efectivo del proceso que crea cada fichero, y los
directorios creados alli tambien tendran el bit S_ISGID activo. Para
un fichero que no tiene el bit de ejecucion 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 solo 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 exito. 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 vacia.
ENOTDIR
Un componente del camino no es un directorio.
ELOOP Se han encontrado demasiados enlaces simbolicos al recorrer el
camino.
EFAULT Direccion erronea.
EACCES Permiso denegado.
ENOMEM Fuera de memoria (es decir, memoria del nucleo).
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 estan especificados por POSIX. La interpretacion difiere entre
sistemas y posiblemente en un mismo sistema cuando estan 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. Las macros S_ISLNK y S_ISSOCK no estan en
POSIX.1-1996, pero ambas formaran parte del proximo estandar POSIX; la
primera es de SVID 4v2, la ultima de SUSv2.
Unix V7 (y sistemas posteriores) tenian S_IREAD, S_IWRITE, S_IEXEC,
donde POSIX prescribe los sinonimos S_IRUSR, S_IWUSR, S_IXUSR.
OTROS SISTEMAS
Valores que han estado (o estan) en uso en varios sistemas:
hex nombre ls octal descripcion
f000 S_IFMT 170000 Mascara 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 (tuberia 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 semaforo 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 simbolico
b000 S_IFSHAD 130000 Solaris: nodo-i sombra para ACL
(no visto por el espacio de usuario)
c000 S_IFSOCK s= 140000 BSD: conector (tambien "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 codigo
intercambiado incluso despues de usarse
SVID-v2: reservado
SunOS: En ficheros no directorios: no
colocar en cache este fichero
SVID-v4.2: En directorios: opcion de
elminacion restringida
0400 S_ISGID 002000 V7: SETGID al ejecuctar
Para directorios: usar semantica BSD
para propagacion 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' aparecion en AT&T UNIX Version 32V.
V'EASE TAMBI'EN
chmod(2), chown(2), readlink(2), utime(2)