Stat System Ring Linux Tutorial

Stat System Ring Linux Tutorial

Linux -systemanrop

Systemanrop levert av Linux -kjernen er utsatt på programmeringsspråket C via GLIBC. Når en systemanrop brukes, kommuniserer du til operativsystemet, og ved retur kommuniserer OS til deg gjennom parametrene som blir returnert til systemanropsfunksjoner (returverdier).

Stat -systemanrop:

Stat System Call er et systemanrop i Linux for å sjekke statusen til en fil som for å sjekke når filen ble åpnet. Stat () systemanrop returnerer faktisk filattributter. Filattributtene til en inode blir i utgangspunktet returnert av STAT () -funksjonen. En inode inneholder metadataene til filen. En inode inneholder: filtypen, størrelsen på filen, når filen ble åpnet (modifisert, slettet) som er tidsstempler, og banen til filen, bruker -ID og gruppe -ID, lenker til filen , og fysisk adresse på filinnhold.

Vi kan si at Inode inneholder alle dataene som kreves for STAT () -systemanropet, og det er indeksnummeret for filen som er lagret i INODE -tabellen. Hver gang du oppretter en fil, opprettes det et inode -nummer for den filen. Bruke STAT -system Ring Systemtabellene kan vises.

Syntaks av C Stat System Call:

For å bruke statssystemanropet på C -programmeringsspråk, må du ta med følgende overskriftsfil:

#inkludere

Stat brukes til å få status som en fil. Syntaksen til C Stat System Call er kanskje ikke det samme for hvert operativsystem. I Linux er syntaks for statssystemanrop som følger:

int stat (const char *path, struct stat *buf)

Returtypen for funksjonen i int, hvis funksjonen blir utført med hell, 0 returneres hvis det er noen feil, vil -1 blir returnert.

Her const char *sti Angir navnet på filen. Hvis filen til filen er en symbolsk lenke, må du spesifisere lenken i stedet for filnavnet.

Så i funksjonen har vi en statsstruktur der dataene eller informasjonen om filen er lagret som bruker en peker som er navngitt buf, som blir sendt inn som et paramteter og fylt ut under utførelsen av samtalen og lesbar av brukeren etter samtalen.

Statstruktur:

Statstrukturen som er definert i overskriftsfilen inneholder følgende felt:

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 TimSpec St_atim;
struct timSpec st_mtim;
struct TimSpec St_CTIM;
blksize_t st_blksize;
blkcnt_t st_blocks;
;

Beskrivelse:

  1. st_dev: Det er ID for enheten vi har filen vår bosatt for øyeblikket.
  2. st_rdev: Dette feltet beskriver at en bestemt fil representerer en bestemt enhet.
  3. st_ino: Det er inode -nummeret eller serienummeret til filen. Ettersom det er et indeksnummer, så det skal være unikt for alle filer
  4. st_size: st_størrelse er størrelsen på filen i byte.
  5. st_atime: Det er siste gang eller det siste tidspunktet hvor filen ble åpnet.
  6. st_ctime: Det er det siste tidspunktet hvor statusen eller tillatelsene til filen ble endret.
  7. st_mtime: Det er det siste tidspunktet hvor filen ble endret.
  8. st_blksize: Dette feltet gir den foretrukne blokkstørrelsen for I/O -filsystem som kan variere fra fil til fil.
  9. st_blocks: Dette feltet forteller det totale antall blokker i multipler på 512 byte.
  10. st_nlink: Dette feltet forteller det totale antallet harde lenker.
  11. st_uid: Dette feltet indikerer bruker -ID.
  12. st_gid: Dette feltet indikerer gruppe -ID.
  13. st_mode: Det indikerer tillatelsene på filen, forteller modusene på en fil. Følgende er flaggene som bør defineres for ST_Mode -feltet:
Flagg Beskrivelse Flaggverdi
S_ifmt En bitmask pleide å få modusverdi på en fil 0170000
S_ifsock En filkonstant av stikkontakt 0140000
S_iflink En filkonstant av symbolsk lenke 0120000
S_ifreg Filkonstant for vanlig fil 0100000
S_ifblk Filkonstant for blokkeringsfil 0060000
S_ifdir Filkonstant for katalogfil 0040000
S_IFCHR Filkonstant for karakterfil 0020000
S_ififo En filkonstant av FIFO 0010000
S_isuid Sett bruker -ID -bit 0004000
S_isgid Sett gruppe -ID -bit 0002000
S_ISVTX Sticky Bit som indikerer delt tekst 0001000
S_IRWXU Eierstillatelser (les, skriv, utfør) 00700
S_irusr Les tillatelser for eier 00400
S_iwusr Skriv tillatelser for eier 00200
S_IXUSR Utfør tillatelser for eier 00100
S_IRWXG Gruppetillatelser (les, skriv, utfør) 00070
S_irgrp Les tillatelser for gruppe 00040
S_IWGRP Skriv tillatelser for gruppe 00020
S_IXGRP Utfør tillatelser for gruppe 00010
S_IRWXO Tillatelser for andre (les, skriv, utfør) 00007
S_iroth Les tillatelser for andre 00004
S_iwoth Skriv tillatelser for andre 00002
S_IXOTH Utfør tillatelser for andre 00001

Hvordan bruke Stat System Call:

Følgende eksempel viser hvordan du bruker statssystemanrop på programmeringsspråk i Linux, Ubuntu.

Eksempel 1:

I følgende kode skal vi finne modus for en fil:

KODE:

#inkludere
#inkludere
int main ()

// peker til statsstruktur
struct Stat Sfile;
// Stat System Call
stat ("Stat.c ", & sfile);
// tilgang til ST_Mode (Data Member of Stat Struct)
printf ("st_mode = %o", sfile.st_mode);
retur 0;

Å sammenstille og kjøre programmet kommer tilbake som nedenfor:

I denne koden har vi gitt navnet på filen i Stat System Call og deretter pekeren til statstruktur som er SFILE. Pekeren til STAT -struktur brukes deretter til å få tilgang til ST_Mode som viser modus for filen ved hjelp av Printf -setningen.

Topptekstfilen brukes slik at du kan bruke statssystemanrop. Hodefilen er standardinngangs-/utgangsbibliotekfilen slik at du kan bruke Printf eller Scanf i C -koden din.

Eksempel 2:

I følgende kode skal vi få informasjon om filen ved å bruke Stat System Call:

KODE:

#inkludere
#inkludere
#inkludere
#inkludere
void sfile (char const filename []);
int main ()
SSIZE_T LES;
char* buffer = 0;
size_t buf_size = 0;
printf ("Skriv inn navnet på en fil for å sjekke: \ n");
Les = GetLine (& Buffer, & Buf_Size, stdin);
hvis (les <=0 )
printf ("getline mislyktes \ n");
Avslutt (1);

if (buffer [read-1] == '\ n')
buffer [read-1] = 0;

int s = åpen (buffer, o_rdonly);
if (s ==-1)
printf ("filen eksisterer ikke \ n");
Avslutt (1);

ellers
sfile (buffer);

gratis (buffer);
retur 0;

void sfile (char const filnavn [])
struct Stat Sfile;
if (stat (filnavn, & sfile) ==-1)
printf ("feil oppstod \ n");

// tilgang til datamedlemmer i Stat struct
printf ("\ nfile st_uid %d \ n", sfile.st_uid);
printf ("\ nfile st_blksize %ld \ n", sfile.st_blksize);
printf ("\ nfile st_gid %d \ n", sfile.st_gid);
printf ("\ nfile st_blocks %ld \ n", sfile.st_blocks);
printf ("\ nfile st_size %ld \ n", sfile.st_size);
printf ("\ nfile st_nlink %u \ n", (usignert int) sfile.st_nlink);
printf ("\ nfile tillatelser bruker \ n");
printf ((sfile.st_mode & s_irusr)? "r": "-");
printf ((sfile.ST_MODE & S_IWUSR)? "w": "-");
printf ((sfile.ST_MODE & S_IXUSR)? "x": "-");
printf ("\ n");
printf ("\ nfile tillatelser Group \ n");
printf ((sfile.ST_MODE & S_IRGRP)? "r": "-");
printf ((sfile.ST_MODE & S_IWGRP)? "w": "-");
printf ((sfile.ST_MODE & S_IXGRP)? "x": "-");
printf ("\ n");
printf ("\ nfile tillatelser andre \ n");
printf ((sfile.st_mode & s_iroth)? "r": "-");
printf ((sfile.st_mode & s_iwoth)? "w": "-");
printf ((sfile.ST_MODE & S_IXOTH)? "x": "-");
printf ("\ n");

PRODUKSJON:

I ovennevnte C -kode har vi skrevet inn navnet på filen, og hvis filen ikke eksisterer, vil utførelsen av programmet bli stoppet. Dette demonstreres i følgende bilde:

Hvis filen vår eksisterer, vil funksjonen SFILE (n) bli kalt der vi har gitt navnet på filen. Inne i funksjonen, først og fremst har vi brukt Stat System Call, hvis stat () returnerer -1, må det være en feil slik at en melding blir skrevet ut og utførelse av programmet vil bli stoppet.

Så i Printf -setningen har vi brukt navnet på funksjon og prikkseparator for å få tilgang til datamedlemmene til Stat struct.

Så for filmodus har vi fått tilgang til makroene eller flaggene til ST_MODE. Her brukes logisk og operatøren til å skrive ut de respektive modusene. Vi har sjekket for tillatelser for bruker, gruppe og andre for den spesifiserte filen (filnavnet angitt av bruker).

Med dette kan du se hvordan du bruker statssystemanropet fra C -programmeringsspråket for å få informasjon fra OS -kjernen om filer. Hvis du har et spørsmål, kan du fortelle oss via kommentarfelt.