stat () es una llamada al sistema Unix que devuelve atributos de archivo sobre un inodo . La semántica de stat () varía entre sistemas operativos . Como ejemplo, elcomando ls de Unix usa esta llamada al sistema para recuperar información sobre archivos que incluyen:
- atime: hora del último acceso ( ls -lu )
- mtime: hora de la última modificación ( ls -l )
- ctime: hora del último cambio de estado ( ls -lc )
stat
apareció en la versión 1 de Unix . Es una de las pocas llamadas originales al sistema Unix que se cambiarán, con la adición de permisos de grupo y un tamaño de archivo más grande en la Versión 4 . [1]
funciones stat ()
El encabezado de la biblioteca C POSIXsys / stat.h , que se encuentra en POSIX y otros sistemas operativos similares a Unix, declara las stat()
funciones, así como las funciones relacionadas llamadas fstat()
y lstat()
. Las funciones toman un struct stat
argumento de búfer, que se utiliza para devolver los atributos del archivo. En caso de éxito, las funciones devuelven cero y, en caso de error, se devuelve −1 y errno se establece de forma adecuada.
Las funciones stat()
y lstat()
toman un argumento de nombre de archivo . Si el archivo es un enlace simbólico , stat()
devuelve atributos del destino final del enlace, mientras que lstat()
devuelve atributos del enlace en sí. En su lugar, la fstat()
función toma un argumento descriptor de archivo y devuelve atributos del archivo que identifica.
La familia de funciones se amplió para implementar el soporte de archivos grandes . Funciones con nombre stat64()
, lstat64()
y fstat64()
atributos de retorno en una struct stat64
estructura, que representa los tamaños de archivo con un tipo de 64 bits, lo que permite las funciones para trabajar en archivos 2 GIB y más grandes (hasta 8 BEI). Cuando la _FILE_OFFSET_BITS
macro se define en 64, estas funciones de 64 bits están disponibles con los nombres originales.
Las funciones se definen como:
int stat ( const char * nombre de archivo , struct stat * buf ); int lstat ( const char * nombre de archivo , struct stat * buf ); int fstat ( int filedesc , struct stat * buf );
estructura estadística
Esta estructura se define en sys / stat.h archivo de encabezado de la siguiente manera, aunque las implementaciones son libres de definir campos adicionales: [2]
struct stat { mode_t st_mode ; ino_t st_ino ; dev_t st_dev ; dev_t st_rdev ; nlink_t st_nlink ; uid_t st_uid ; gid_t st_gid ; off_t st_size ; struct timespec st_atim ; struct timespec st_mtim ; struct timespec st_ctim ; blksize_t st_blksize ; blkcnt_t st_blocks ; };
POSIX.1 no requiere st_rdev
, st_blocks
y st_blksize
los miembros; estos campos se definen como parte de la opción XSI en la Especificación Única de Unix.
En versiones anteriores del estándar POSIX.1, los campos relacionados con el tiempo se definían como st_atime
, st_mtime
y st_ctime
, y eran de tipo time_t
. Desde la versión 2008 de la norma, estos campos se cambió el nombre a st_atim
, st_mtim
y st_ctim
, respectivamente, del tipo de estructura timespec
, ya que esta estructura proporciona una unidad de tiempo una resolución más alta. En aras de la compatibilidad, las implementaciones pueden definir los nombres antiguos en términos del tv_sec
miembro de struct timespec
. Por ejemplo, st_atime
se puede definir como st_atim.tv_sec
. [2]
La struct stat
estructura incluye al menos los siguientes miembros:
st_dev
- identificador del dispositivo que contiene el archivost_ino
- número de inodost_mode
- modo de protección ; ver también permisos de Unixst_nlink
- recuento de referencias de enlaces durosst_uid
- identificador de usuario del propietariost_gid
- identificador de grupo del propietariost_rdev
- identificador de dispositivo (si es un archivo especial )st_size
- tamaño total del archivo , en bytesst_atime
- hora del último accesost_mtime
- hora de la última modificaciónst_ctime
- hora del último cambio de estadost_blksize
- tamaño de bloque preferido para E / S del sistema de archivos, que puede depender tanto del sistema como del tipo de sistema de archivos [3]st_blocks
- número de bloques asignados en múltiplos deDEV_BSIZE
(normalmente 512 bytes).
El st_mode
campo es un campo de bits . Combina los modos de acceso a archivos y también indica cualquier tipo de archivo especial . Hay muchas macros para trabajar con los diferentes tipos de archivos y marcas de modo.
Crítica de un tiempo
Leer un archivo cambia su atime eventualmente requiere una escritura en disco , lo cual ha sido criticado por ser inconsistente con un sistema de archivos de solo lectura. La memoria caché del sistema de archivos puede reducir significativamente esta actividad a una escritura de disco por cada descarga de memoria caché.
El desarrollador del kernel de Linux, Ingo Molnár , criticó públicamente el concepto y el impacto en el rendimiento de atime en 2007, [4] [5] y en 2009, el La opción de montaje de relatime se había convertido en la predeterminada, lo que aborda esta crítica. [6] El comportamiento detrás del La opción de montaje de relatime ofrece un rendimiento suficiente para la mayoría de los propósitos y no debería interrumpir ninguna aplicación importante, como se ha discutido ampliamente. [7] Inicialmente, relatime solo actualizó atime si atime
Las versiones actuales del kernel de Linux admiten cuatro opciones de montaje, que se pueden especificar en fstab :
- strictatime (anteriormente atime , y anteriormente el predeterminado; strictatime a partir de 2.6.30): actualice siempre un tiempo, que se ajusta al comportamiento definido por POSIX
- relatime (" hora relativa", introducida en 2.6.20 y predeterminada a partir de 2.6.30) - solo actualice una hora en determinadas circunstancias: si la hora anterior es anterior a mtime o ctime, o si la hora anterior es superior a 24 horas en el pasado
- nodiratime : nunca actualice una hora de directorios, pero actualice otros archivos en una hora
- noatime - nunca actualice atime de ningún archivo o directorio; implica nodiratime ; mayor rendimiento, pero menos compatible
- Lazytime : actualice un tiempo de acuerdo con las circunstancias específicas que se describen a continuación.
Las versiones actuales de Linux , macOS , Solaris , FreeBSD y NetBSD admiten una opción de montaje noatime en / etc / fstab , que hace que el campo atime nunca se actualice. La desactivación de la actualización atime rompe el cumplimiento de POSIX y algunas aplicaciones, como las notificaciones de " correo nuevo" impulsadas por mbox , [9] y algunas utilidades de observación del uso de archivos, en particular tmpwatch .
La La opción noatime en OpenBSD se comporta más como Linux relatime . [10]
La versión 4.0 de la línea principal del kernel de Linux , que se lanzó el 12 de abril de 2015, introdujo la nueva opción de montaje. lazytime . Permite que las actualizaciones atime al estilo POSIX se realicen en la memoria y se vacíen en el disco junto con algunas operaciones de E / S no relacionadas con el tiempo en el mismo archivo; Las actualizaciones atime también se vacían en el disco cuando se ejecutan algunas de las llamadas al sistema de sincronización , o antes de que el inodo en memoria del archivo sea desalojado de la caché del sistema de archivos. Además, es posible configurar durante cuánto tiempo pueden permanecer sin descargar las modificaciones de tiempo. De esa forma, lazytime conserva la compatibilidad con POSIX al tiempo que ofrece mejoras de rendimiento. [11] [12]
ctime
Es tentador creer que ctime originalmente significaba tiempo de creación; [13] sin embargo, mientras que los primeros Unix tenían tiempos de modificación y creación, este último se cambió para ser el tiempo de acceso antes de que hubiera una estructura C en la que llamar a cualquier cosa. ctime . Los sistemas de archivos retuvieron solo el tiempo de acceso ( atime ) y tiempo de modificación ( mtime ) hasta la sexta edición de Unix. La La marca de tiempo ctime se agregó en la reestructuración del sistema de archivos que ocurrió con la séptima edición de Unix, y siempre se ha referido al tiempo de cambio de inodo. Se actualiza cada vez que los metadatos del archivo almacenados en el inodo cambian, como los permisos del archivo , la propiedad del archivo y la creación y eliminación de enlaces físicos . En algunas implementaciones, ctime se ve afectado al cambiar el nombre de un archivo: tanto Unix original, que implementó un cambio de nombre haciendo un enlace (actualizando ctime ) y luego desvincular el nombre anterior (actualizando ctime otra vez) y Linux moderno tienden a hacer esto.
a diferencia de atime y mtime , ctime no se puede establecer en un valor arbitrario con utime () , como lo usa el utilidad táctil , por ejemplo. En cambio, cuando utime () , o para cualquier otro cambio en el inodo que no sea una actualización de atiempo causado por acceder al archivo, el El valor de ctime se establece en la hora actual.
Granularidad de tiempo
- time_t proporciona tiempos precisos hasta un segundo.
- Algunos sistemas de archivos proporcionan una granularidad más fina. Solaris 2.1 introdujo una resolución de microsegundos con UFS en 1992 [ cita requerida ] y una resolución de nanosegundos con ZFS. [ cita requerida ]
- En los kernels de Linux 2.5.48 y superiores, la estructura de estadísticas admite una resolución de nanosegundos para los tres campos de marca de tiempo del archivo. Estos se exponen como campos adicionales en la estructura de estadísticas. [14] [15]
- La resolución del tiempo de creación en el sistema de archivos FAT es de 10 milisegundos, mientras que la resolución de su tiempo de escritura es de dos segundos y el tiempo de acceso tiene una resolución de un día, por lo que actúa como la fecha de acceso. [dieciséis]
Ejemplo
#include #include #include #include #include #include #include int main ( int argc , char * argv []) {struct stat sb ; struct passwd * pwuser ; estructura grupo * grpnam ;if ( argc < 2 ) { fprintf ( stderr , "Uso:% s: archivo ... \ n " , argv [ 0 ]); salir ( EXIT_FAILURE ); }for ( int i = 1 ; i < argc ; i ++ ) { if ( -1 == stat ( argv [ i ], & sb )) { perror ( "stat ()" ); salir ( EXIT_FAILURE ); }if ( NULL == ( pwuser = getpwuid ( sb . st_uid ))) { perror ( "getpwuid ()" ); salir ( EXIT_FAILURE ); }if ( NULL == ( grpnam = getgrgid ( sb . st_gid ))) { perror ( "getgrgid ()" ); salir ( EXIT_FAILURE ); }printf ( "% s: \ n " , argv [ i ]); printf ( " \ t inodo:% u \ n " , sb . st_ino ); printf ( " \ t propietario:% u (% s) \ n " , sb . st_uid , pwuser -> pw_name ); printf ( " \ t grupo:% u (% s) \ n " , sb . st_gid , grpnam -> gr_name ); printf ( " \ t permisos:% o \ n " , sb . st_mode & ( S_IRWXU | S_IRWXG | S_IRWXO )); printf ( " \ t enlaces:% d \ n " , sb . st_nlink ); printf ( " \ t tamaño:% ld \ n " , sb . st_size ); / * puede usar% lld * / printf ( " \ t atime:% s" , ctime ( & sb . st_atim . tv_sec )); printf ( " \ t mtime:% s" , ctime ( & sb . st_mtim . tv_sec )); printf ( " \ t ctime:% s" , ctime ( & sb . st_ctim . tv_sec ));printf ( " \ n " ); }return 0 ; }
Referencias
- ^ McIlroy, MD (1987). Un lector de investigación Unix: extractos comentados del Manual del programador, 1971–1986 (PDF) (Informe técnico). CSTR. Bell Labs. 139.
- ↑ a b Stevens y Rago , 2013 , p. 94.
- ^ "" . Especificaciones básicas de Open Group Edición 6 — IEEE Std 1003.1, edición de 2004 . El grupo abierto. 2004.
- ^ Kernel Trap: Linux: Reemplazo de atime con relatime , por Jeremy, 7 de agosto de 2007
- ^ Érase una vez , LWN, por Jonathan Corbet, 8 de agosto de 2007
- ^ Linux kernel 2.6.30 , principiantes del kernel de Linux
- ^ Ese hilo de sistema de archivos masivo , LWN, por Jonathan Corbet, 31 de marzo de 2009
- ^ Resumen de Relatime , Valerie Aurora
- ^ http://www.mail-archive.com/[email protected]/msg24912.html "el monitor $ MAIL del shell ... depende de atime, pronunciando el nuevo correo electrónico con atime ($ MAIL)
- ^ "mount (2) - Páginas de manual de OpenBSD" . openbsd.org . 27 de abril de 2018 . Consultado el 26 de septiembre de 2018 .
- ^ "Linux kernel 4.0, sección 1.5. Opción 'lazytime' para una mejor actualización de las marcas de tiempo de los archivos" . kernelnewbies.org . 1 de mayo de 2015 . Consultado el 2 de mayo de 2015 .
- ^ Jonathan Corbet (19 de noviembre de 2014). "Introduciendo lazytime" . LWN.net . Consultado el 2 de mayo de 2015 .
- ^ https://www.bell-labs.com/usr/dmr/www/cacm.html
- ^ "stat (2) - página de manual de Linux" . man7.org . Consultado el 27 de febrero de 2015 .
- ^ Andreas Jaeger (2 de diciembre de 2002), struct stat.h con resolución de nanosegundos , archivo de correo de la lista de correo [email protected] para el proyecto glibc.
- ^ MSDN: tiempos de archivo
- IEEE Std 1003.1, 2004, documentación para fstat (2) . Consultado el 7 de junio de 2012.
- stat (2) Página de manual de Linux . Consultado el 7 de junio de 2012.
- W. Richard, Stevens; Stephen A., Rago (24 de mayo de 2013). Programación avanzada en el entorno UNIX (Tercera ed.). Addison-Wesley Professional . ISBN 978-0321637734. Consultado el 27 de febrero de 2015 .
enlaces externos
- Un ejemplo que muestra cómo usar stat ()
- stat () en Perl
- stat () en PHP
- atime y relatime