Stat (crida al sistema)
| Tipus | crida de sistema |
|---|---|
| Característiques tècniques | |
| Plataforma | Biblioteca estàndard C |
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]

stat- 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()
[modifica]La 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
[modifica]Aquesta 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].
- 1 2 Stevens i Rago, 2013, p. 94.
- ↑ «Stat () System Call In C Program With Examples | Program Solve» (en anglès americà), 07-07-2021. Arxivat de l'original el 2023-12-25. [Consulta: 25 desembre 2023].
