Stat (crida al sistema)

Crida al sistema Unix

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()
Modifica el valor a Wikidata
Tipuscrida de sistema Modifica el valor a Wikidata
Característiques tècniques
PlataformaBiblioteca estàndard C
línia d'ordres 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
  1. «stat(2) - Linux man page» (en anglès). [Consulta: 25 desembre 2023].
  2. «stat(2) - Linux manual page» (en anglès). [Consulta: 25 desembre 2023].
  3. «The stat() system call» (en anglès americà), 28-09-2018. [Consulta: 25 desembre 2023].
  4. 4,0 4,1 Stevens i Rago, 2013, p. 94.
  5. «Stat () System Call In C Program With Examples | Program Solve» (en anglès americà), 07-07-2021. [Consulta: 25 desembre 2023].