Stat System Call Linux Tutorial

Stat System Call Linux Tutorial



Systemanrop som tillhandahålls av Linux -kärnan exponeras i programmeringsspråket C via glibc. När ett systemanrop används kommunicerar du till operativsystemet och vid återkomst kommunicerar operativsystemet till dig via parametrarna som returneras till systemsamtalets funktioner (returvärden).

Stat System Call:

Stat systemanrop är ett systemanrop i Linux för att kontrollera status för en fil, till exempel för att kontrollera när filen var åtkomst. Systemanropet stat () returnerar faktiskt filattribut. Filattributen för en inod returneras i princip av funktionen Stat (). En inod innehåller metadata för filen. En inod innehåller: filtypen, filens storlek, när filen öppnades (modifierades, raderades) som är tidsstämplar och filens sökväg, användar -ID och grupp -ID, länkar till filen och fysisk adress för filinnehåll.







Vi kan säga att inode innehåller all data som krävs för stat () systemanropet och det är indexnumret för filen som sparas i inodtabellen. När du skapar en fil skapas ett inodnummer för den filen. Med hjälp av stat system call kan systemtabellerna ses.



Syntax för C Stat -systemanrop:

För att använda statssystemanropet i programmeringsspråk C måste du inkludera följande rubrikfil:



#omfatta

Stat används för att få status på en fil. Syntaxen för C stat systemanrop är kanske inte densamma för alla operativsystem. I Linux är syntaxen för stat systemanrop följande:





intstat(konst röding *väg, strukturstat*buf)

Returtypen för funktionen i int, om funktionen utförs framgångsrikt returneras 0 om det finns några fel, -1 kommer att returneras.

Här const char *sökväg anger namnet på filen. Om filens sökväg är en symbolisk länk måste du ange länken istället för filnamn.



Sedan i funktionen har vi en statstruktur där data eller information om filen lagras som använder en pekare som heter buf, som skickas in som parametrar och fylls i under samtalets genomförande och kan läsas av användaren efter samtalet.

Statens struktur:

Statstrukturen som definieras i rubrikfilen innehåller följande fält:

strukturstat
{
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_tst_size;
strukturtimspec st_atim;
strukturtimspec st_mtim;
strukturtimspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
};

Beskrivning:

  1. st_dev: Det är ID för enheten där vi har vår fil som för närvarande finns.
  2. st_rdev: Detta fält beskriver att en viss fil representerar en viss enhet.
  3. st_ino: Det är filens inodnummer eller serienummer. Eftersom det är ett indexnummer så bör det vara unikt för alla filer
  4. st_size: st_size är storleken på filen i byte.
  5. st_atime: Det är sista eller senaste gången som filen öppnades.
  6. st_ctime: Det är den senaste tiden då status eller behörigheter för filen ändrades.
  7. st_mtime: Det är den senaste tiden då filen ändrades.
  8. st_blksize: Detta fält ger den föredragna blockstorleken för I/O -filsystem som kan variera från fil till fil.
  9. st_blocks: Detta fält anger det totala antalet block i multiplar av 512 byte.
  10. st_nlink: Detta fält anger det totala antalet hårda länkar.
  11. st_uid: Detta fält anger användar -ID.
  12. st_gid: Detta fält anger grupp -ID.
  13. st_mode: Det indikerar behörigheterna för filen, berättar lägena för en fil. Följande är flaggorna som bör definieras för fältet st_mode:
Flaggor Beskrivning Flagga värde
S_IFMT En bitmask som används för att få lägesvärde för en fil 0170000
S_IFSOCK En filkonstant av uttaget 0140000
S_IFLINK En filkonstant med symbolisk länk 0120000
S_IFREG Filkonstant för vanlig fil 0100000
S_IFBLK Filkonstant för blockfil 0060000
S_IFDIR Filkonstant för katalogfil 0040000
S_IFCHR Filkonstant för teckenfil 0020000
S_IFIFO En filkonstant på fifo 0010000
S_ISUID Ställ in User ID -bit 0004000
S_ISGID Ställ in grupp -ID -bit 0002000
S_ISVTX Klibbig bit som indikerar delad text 0001000
S_IRWXU Ägarbehörighet (läs, skriv, kör) 00700
S_IRUSR Läs behörigheter för ägaren 00400
S_IWUSR Skriv behörigheter för ägaren 00200
S_IXUSR Utför behörigheter för ägaren 00100
S_IRWXG Grupptillstånd (läs, skriv, kör) 00070
S_IRGRP Läs Behörigheter för grupp 00040
S_IWGRP Skriv behörigheter för grupp 00020
S_IXGRP Utför behörigheter för gruppen 00010
S_IRWXO Behörigheter för andra (läs, skriv, kör) 00007
S_IROTH Läs behörigheter för andra 00004
S_IWOTH Skriv behörigheter för andra 00002
S_IXOTH Utför behörigheter för andra 00001

Så här använder du Stat System Call:

Följande exempel visar hur du använder stat systemanrop i C -programmeringsspråk i Linux, Ubuntu.

EXEMPEL 1:

I följande kod kommer vi att hitta läget för en fil:

KODA:

#omfatta
#omfatta
inthuvud()
{
// pekare till stat struct
strukturstaten sfile;

// stat systemanrop
stat('stat.c', &sfile);

// åtkomst till st_mode (data medlem i stat struct)
printf ('st_mode = %o',sfile.st_mode);
lämna tillbaka 0;
}

Kompilering och körning av programmet returnerar enligt nedan:

I den här koden har vi skickat namnet på filen i stat systemanrop och sedan pekaren till stat struct som är sfile. Pekaren till stat struct används sedan för att komma åt st_mode som visar filens läge med printf -sats.

Rubrikfilen används så att du kan använda stat systemanrop. Rubrikfilen är standardinput/output -biblioteksfilen så att du kan använda printf eller scanf i din C -kod.

EXEMPEL 2:

I följande kod kommer vi att få information om filen med stat systemanrop:

KODA:

#omfatta
#omfatta
#omfatta
#omfatta

tomhetsfile(röding konstfilnamn[]);

inthuvud(){
ssize_t läst;
röding*buffert= 0;
storlek_tbuf_size= 0;

printf ('Ange namnet på en fil för att kontrollera: n');
läsa=getline(&buffert, &buf_size,stdin);

om (läsa<=0 ){
printf ('getline misslyckades n');
utgång (1);
}

om (buffert[läsa-1] == ' n'){
buffert[läsa-1] = 0;
}

ints=öppen(buffert,O_RDONLY);
om(s== -1){
printf ('Filen finns inte n');
utgång (1);
}
annan{
sfile(buffert);
}
fri (buffert);
lämna tillbaka 0;
}

tomhetsfile(röding konstfilnamn[]){

strukturstaten sfile;

om(stat(filnamn, &sfile)== -1){
printf ('Fel inträffade n');
}

// Åtkomst till datamedlemmar av stat struct
printf (' nFil st_uid %d n',sfile.st_uid);
printf (' nFilen st_blksize %ld n',sfile.st_blksize);
printf (' nFilen st_gid %d n',sfile.st_gid);
printf (' nFil st_blocks %ld n',sfile.st_block);
printf (' nFil st_size %ld n',sfile.st_size);
printf (' nFil st_nlink% u n',(osignerad int)sfile.st_nlink);
printf (' nAnvändare av filtillstånd n');
printf ((sfile.st_mode &S_IRUSR)? 'r':'-');
printf ((sfile.st_mode &S_IWUSR)? 'i':'-');
printf ((sfile.st_mode &S_IXUSR)? 'x':'-');
printf (' n');
printf (' nFilbehörighetsgrupp n');
printf ((sfile.st_mode &S_IRGRP)? 'r':'-');
printf ((sfile.st_mode &S_IWGRP)? 'i':'-');
printf ((sfile.st_mode &S_IXGRP)? 'x':'-');
printf (' n');
printf (' nFiltillstånd Annat n');
printf ((sfile.st_mode &S_IROTH)? 'r':'-');
printf ((sfile.st_mode &S_IWOTH)? 'i':'-');
printf ((sfile.st_mode &S_IXOTH)? 'x':'-');
printf (' n');
}

PRODUKTION:

I ovanstående C -kod har vi angett filnamnet och om filen inte existerar stoppas körningen av programmet. Detta visas i följande bild:

Om vår fil finns kommer funktionen sfile (n) att anropas där vi har skickat filens namn. Inne i funktionen, först och främst har vi använt Stat systemanrop, om stat () returnerar -1 måste det vara ett fel så att ett meddelande kommer att skrivas ut och körningen av programmet stoppas.

Sedan i printf -satsen har vi använt funktionens namn och punktseparator för att komma åt datamedlemmarna i stat struct .

Sedan för filläget har vi öppnat makron eller flaggorna för st_mode. Här används logik och operator för att skriva ut respektive lägen. Vi har sökt efter behörigheter för användare, grupp och andra för den angivna filen (filnamn angivet av användare).

Med detta kan du se hur du använder statssystemsamtalet från programmeringsspråket C för att få information från OS -kärnan om filer. Om du har en fråga, berätta gärna för oss via kommentarsfältet.