stat (systemopkald) - stat (system call)
stat () er et Unix- systemopkald, der returnerer filattributter om en inode . Semantikken for stat () varierer mellem operativsystemer . Som et eksempelbruger Unix- kommandoen ls dette systemopkald til at hente oplysninger om filer, der inkluderer:
- tidspunkt: tidspunkt for sidste adgang ( ls -lu )
- mtime: tidspunkt for sidste ændring ( ls -l )
- ctime: tidspunkt for sidste statusændring ( ls -lc )
statoptrådte i version 1 Unix . Det er blandt de få originale Unix- systemopkald til ændringer, med version 4 's tilføjelse af gruppetilladelser og større filstørrelse .
stat () funktioner
Den C POSIX bibliotek header sys / stat.h , der findes på POSIX og andre Unix-lignende operativsystemer, erklærer de stat()funktioner, samt relaterede funktioner kaldet fstat()og lstat(). Funktionerne tager et struct statbufferargument, der bruges til at returnere filattributterne. Ved succes returnerer funktionerne nul, og ved fejl returneres -1 og errno indstilles korrekt.
Funktionerne stat()og lstat()tager et filnavnargument . Hvis filen er et symbolsk link , stat()returnerer attributter for det endelige mål for linket, mens lstat()returnerer attributter for selve linket. Den fstat()funktion tager en fil deskriptor argument i stedet, og vender tilbage attributter på den fil, den identificerer.
Funktionsfamilien blev udvidet til at implementere stor filunderstøttelse . Funktioner navngivne stat64(), lstat64()og fstat64()retur attributter i en struct stat64struktur, som repræsenterer filstørrelser med en 64-bit typen, så funktionerne til arbejdet med filer 2 Gib og større (op til 8 EIB). Når _FILE_OFFSET_BITS makroen er defineret til 64, er disse 64-bit-funktioner tilgængelige under de originale navne.
Funktionerne er defineret som:
int stat(const char *filename, struct stat *buf);
int lstat(const char *filename, struct stat *buf);
int fstat(int filedesc, struct stat *buf);
stat struktur
Denne struktur er defineret i sys / stat.h header-fil som følger, selvom implementeringer frit kan definere yderligere felter:
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 kræver ikke st_rdev, st_blocksog st_blksizemedlemmer; disse felter er defineret som en del af XSI-indstillingen i Single Unix Specification.
I ældre versioner af POSIX.1-standarden blev de tidsrelaterede felter defineret som st_atime, st_mtimeog st_ctimeog var af typen time_t. Siden 2008-version af standarden for, blev disse felter omdøbt til st_atim, st_mtimog st_ctimhenholdsvis af typen struct timespec, da denne struktur giver en højere opløsning tidsenhed. Af hensyn til kompatibiliteten kan implementeringer definere de gamle navne med hensyn til tv_secmedlemmet af struct timespec. For eksempel st_atimekan defineres som st_atim.tv_sec.
Den struct statStrukturen omfatter mindst følgende elementer:
-
st_dev- identifikator for enhed, der indeholder fil -
st_ino- inode nummer -
st_mode- beskyttelse tilstand ; se også Unix-tilladelser -
st_nlink- referenceantal for hårde links -
st_uid- brugerens id til ejer -
st_gid- gruppeidentifikator for ejer -
st_rdev- enhedsidentifikator (hvis speciel fil ) -
st_size- samlet filstørrelse i byte -
st_atime- tidspunkt for sidste adgang -
st_mtime- tidspunkt for sidste ændring -
st_ctime- tidspunkt for sidste statusændring -
st_blksize- foretrukket blokstørrelse for filsystemets I / O, som kan afhænge af både systemet og typen af filsystem -
st_blocks- antal blokke allokeret i multipla afDEV_BSIZE(normalt 512 byte).
Det st_modefelt er en smule felt . Det kombinerer fil access tilstande og viser også nogen speciel filtype . Der er mange makroer til at arbejde med de forskellige funktionsflag og filtyper.
Kritik af atime
Læsning af en fil ændrer sin tid, hvilket i sidste ende kræver en skriveskrivning , hvilket er blevet kritiseret, da det ikke er i overensstemmelse med et skrivebeskyttet filsystem. Filsystemets cache kan reducere denne aktivitet betydeligt til en diskskrivning pr. Cache-skylning.
Linux-kernen udvikler Ingo Molnár offentligt kritiseret konceptet og udførelsen virkningen af atime i 2007, og i 2009, den relatime mount option var blevet standard, som adresser denne kritik. Opførslen bag indstillingen relatime mount tilbyder tilstrækkelig ydeevne til de fleste formål og bør ikke bryde nogen væsentlige applikationer, da det er blevet diskuteret grundigt. I første omgang relatime kun opdateret atime hvis atime <mtime eller atime <ctime; der blev efterfølgende ændret til at opdatere tidspunkter, der var 24 timer gamle eller ældre, så tmpwatch og Debians popularitetstæller (popcon) ville opføre sig ordentligt.
Nuværende versioner af Linux-kernen understøtter fire monteringsindstillinger, som kan specificeres i fstab :
- strictatime (tidligere atime , og tidligere standard, strictatime som af 2.6.30) - altid opdatere atime, der stemmer overens med adfærden defineret af POSIX
- relatime ("relative atime", introduceret i 2.6.20 og standard pr. 2.6.30) - opdater kun atime under visse omstændigheder: hvis det foregående atime er ældre end mtime eller ctime, eller det foregående atime er over 24 timer i fortiden
- nodiratime - opdater aldrig tid til mapper, men opdater opdateringer af andre filer
- noatime - opdater aldrig tid til nogen fil eller bibliotek; indebærer nodiratime ; højeste ydeevne, men mindst kompatibel
- lazytime - opdater atime i henhold til specifikke omstændigheder beskrevet nedenfor
Aktuelle versioner af Linux , macOS , Solaris , FreeBSD og NetBSD understøtter en noatime- monteringsmulighed i / etc / fstab , hvilket får atime-feltet til aldrig at blive opdateret. Deaktivering af ajourføring af gangen bryder POSIX- overholdelse og nogle applikationer, såsom mbox- drevne "nye e-mail " -meddelelser og nogle filanvendelsesværktøjer, især tmpwatch .
Den noatime option på OpenBSD opfører sig mere som Linux relatime .
Version 4.0 af Linux-kernens hovedlinie , der blev frigivet den 12. april 2015, introducerede den nye monteringsmulighed lazytime . Det gør det muligt at udføre POSIX-stil atime-opdateringer i hukommelsen og skylles til disken sammen med nogle ikke-tidsrelaterede I / O-operationer på den samme fil; atime-opdateringer skylles også til disken, når nogle af synkroniseringssystemopkaldene udføres, eller før filens in-memory-inode fjernes fra filsystemets cache. Derudover er det muligt at konfigurere, hvor længe atime-ændringer kan forblive uspolede. På den måde bevarer lazytime POSIX-kompatibilitet, mens de tilbyder forbedringer af ydeevnen.
ctime
Det er fristende at tro, at ctime oprindeligt betød skabelsestid; men mens tidlige Unix havde ændringer og oprettelsestider, blev sidstnævnte ændret til at være adgangstid, før der var nogen C-struktur, hvor man kunne kalde noget ctime . Filsystemerne bevarede kun adgangstid ( atime ) og ændringstid ( mtime ) gennem 6. udgave Unix. Den ctime tidsstempel blev tilføjet i omstruktureringen filsystem, der fandt sted med 7. udgave Unix, og har altid henvist til inode forandring tid. Det opdateres når som helst filmetadata, der er gemt i inodeændringerne, såsom filtilladelser , filejerskab og oprettelse og sletning af hårde links . I nogle implementeringer påvirkes ctime af omdøbning af en fil: Begge originale Unix, som implementerede en omdøbning ved at oprette et link (opdatering af ctime ) og derefter fjerne linket til det gamle navn (opdatering af ctime igen) og moderne Linux har tendens til at gøre dette.
Modsætning atime og mtime , ctime kan ikke sættes til en arbitrær værdi med utime () , som anvendes af berøring nytte, f.eks. I stedet, når utime () bruges eller til enhver anden ændring af inoden end en opdatering til atime forårsaget af adgang til filen, indstilles ctime- værdien til det aktuelle tidspunkt.
Tidsgranularitet
- time_t giver tidspunkter nøjagtige til et sekund.
- Nogle filsystemer giver finere granularitet. Solaris 2.1 introducerede en mikrosekundopløsning med UFS i 1992 og en nanosekundopløsning med ZFS.
- I Linux-kerner 2.5.48 og derover understøtter statstrukturen nanosekundopløsning for de tre filtidsstempelfelter. Disse eksponeres som yderligere felter i statstrukturen.
- Opløsningen af oprettelsestid på FAT-filsystemet er 10 millisekunder, mens opløsning af dets skrivetid er to sekunder, og adgangstiden har en opløsning på en dag, så den fungerer som adgangsdatoen.
Eksempel
#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;
}
Referencer
- IEEE Std 1003.1, 2004, dokumentation for fstat (2) . Hentet 07.06.2012.
- stat (2) Linux-mandside . Hentet 07.06.2012.
- W. Richard, Stevens; Stephen A., Rago (24. maj 2013). Avanceret programmering i UNIX-miljøet (tredje udgave). Addison-Wesley Professional . ISBN 978-0321637734. Hentet 27. februar 2015 .