Stat (crida al sistema)
stat() és una crida al sistema Unix que retorna atributs de fitxer sobre un inode. La semàntica destat() varia entre els sistemes operatius. Com a exemple, l'ordre Unixls utilitza aquesta crida al sistema per recuperar informació dels fitxers que inclou: [1]
| |
Tipus | crida de sistema |
---|---|
Característiques tècniques | |
Plataforma | Biblioteca estàndard C |
- hora: hora de l'últim accés (ls -lu )
- mtime: hora de l'última modificació (ls -l )
- ctime: hora de l'últim canvi d'estat (ls -lc )
stat
va aparèixer a la versió 1 d'Unix. Es troba entre les poques crides originals del sistema Unix per canviar, amb l'addició de la versió 4 de permisos de grup i una mida de fitxer més gran.[2]
Funcions stat()
modificaLa capçalera de la biblioteca C POSIXsys/stat.h, que es troba a POSIX i altres sistemes operatius semblants a Unix, declara les funcions stat()
, així com les funcions relacionades anomenades fstat()
i lstat()
. Les funcions prenen un argument de memòria intermèdia struct stat
, que s'utilitza per retornar els atributs del fitxer. En cas d'èxit, les funcions tornen zero, i en cas d'error, es retorna −1 i errno s'estableix adequadament.[3]
The stat()
and lstat()
functions take a filename argument. If the file is a symbolic link, stat()
returns attributes of the eventual target of the link, while lstat()
returns attributes of the link itself. The fstat()
function takes a file descriptor argument instead, and returns attributes of the file that it identifies.
La família de funcions es va ampliar per implementar suport de fitxers grans. Les funcions anomenades stat64()
, lstat64()
i fstat64()
retornen atributs en una estructura struct stat64
, que representa mides de fitxer amb un tipus de 64 bits, permetent que les funcions funcionin en fitxers 2 GiB i més grans (fins a 8 EiB). Quan la macro _FILE_OFFSET_BITS
es defineix a 64, aquestes funcions de 64 bits estan disponibles amb els noms originals.
Les funcions es defineixen com:
int stat(const char *filename, struct stat *buf);
int lstat(const char *filename, struct stat *buf);
int fstat(int filedesc, struct stat *buf);
Estructura stat
modificaAquesta estructura es defineix asys/stat.h fitxer de capçalera de la següent manera, tot i que les implementacions són lliures de definir camps addicionals:[4]
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 requereix membres st_rdev
, st_blocks
i st_blksize
; aquests camps es defineixen com a part de l'opció XSI a l'especificació Unix única.
A les versions anteriors de l'estàndard POSIX.1, els camps relacionats amb el temps es definien com st_atime
, st_mtime
i st_ctime
, i eren de tipus time_t
. Des de la versió 2008 de l'estàndard, aquests camps es van canviar de nom a st_atim
, st_mtim
i st_ctim
, respectivament, de tipus struct timespec
, ja que aquesta estructura proporciona una unitat de temps de resolució més alta. Per motius de compatibilitat, les implementacions poden definir els noms antics en termes del membre tv_sec
de struct timespec
. Per exemple, st_atime
es pot definir com a st_atim.tv_sec
.[4]
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>
#include <sys/stat.h>
int
main(int argc, char *argv[])
{
struct stat sb;
struct passwd *pwuser;
struct group *grpnam;
if (argc < 2)
{
fprintf(stderr, "Usage: %s: file ...\n", argv[0]);
exit(EXIT_FAILURE);
}
for (int i = 1; i < argc; i++)
{
if (-1 == stat(argv[i], &sb))
{
perror("stat()");
exit(EXIT_FAILURE);
}
if (NULL == (pwuser = getpwuid(sb.st_uid)))
{
perror("getpwuid()");
exit(EXIT_FAILURE);
}
if (NULL == (grpnam = getgrgid(sb.st_gid)))
{
perror("getgrgid()");
exit(EXIT_FAILURE);
}
printf("%s:\n", argv[i]);
printf("\tinode: %u\n", sb.st_ino);
printf("\towner: %u (%s)\n", sb.st_uid, pwuser->pw_name);
printf("\tgroup: %u (%s)\n", sb.st_gid, grpnam->gr_name);
printf("\tperms: %o\n", sb.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO));
printf("\tlinks: %d\n", sb.st_nlink);
printf("\tsize: %ld\n", sb.st_size); /* you may use %lld */
printf("\tatime: %s", ctime(&sb.st_atim.tv_sec));
printf("\tmtime: %s", ctime(&sb.st_mtim.tv_sec));
printf("\tctime: %s", ctime(&sb.st_ctim.tv_sec));
printf("\n");
}
return 0;
}
Referències
modifica- ↑ «stat(2) - Linux man page» (en anglès). [Consulta: 25 desembre 2023].
- ↑ «stat(2) - Linux manual page» (en anglès). [Consulta: 25 desembre 2023].
- ↑ «The stat() system call» (en anglès americà), 28-09-2018. [Consulta: 25 desembre 2023].
- ↑ 4,0 4,1 Stevens i Rago, 2013, p. 94.
- ↑ «Stat () System Call In C Program With Examples | Program Solve» (en anglès americà), 07-07-2021. [Consulta: 25 desembre 2023].