Stat System Call Linux Tutorial

Stat System Call Linux Tutorial



Systemanrop levert av Linux -kjernen blir avslørt i programmeringsspråket C via glibc. Når et systemanrop brukes, kommuniserer du til operativsystemet og ved retur kommuniserer operativsystemet til deg gjennom parameterne som returneres til systemanropsfunksjoner (returverdier).

Stat System Call:

Stat systemanrop er et systemanrop i Linux for å kontrollere statusen til en fil, for eksempel å sjekke når filen ble åpnet. Stat () systemanropet returnerer faktisk filattributter. Filattributtene til en inode returneres i utgangspunktet av Stat () -funksjonen. En inode inneholder filens metadata. En inode inneholder: filtypen, filstørrelsen, når filen ble åpnet (endret, slettet) som er tidsstempler, og banen til filen, bruker -ID og gruppe -ID, lenker til filen og fysisk adresse til 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. Når du oppretter en fil, opprettes et inode -nummer for den filen. Ved å bruke stat system call kan du se systemtabellene.



Syntaks for C Stat -systemanrop:

For å bruke stat -systemanropet i programmeringsspråk C, må du inkludere følgende toppfil:



#inkludere

Stat brukes til å få status for en fil. Syntaksen til C stat systemanrop er kanskje ikke den samme for hvert operativsystem. I Linux er syntaksen for stat systemanrop som følger:





intstat(konst røye *sti, strukturstat*buf)

Returtypen for funksjonen i int, hvis funksjonen utføres vellykket, returneres 0 hvis det er noen feil, -1 vil bli returnert.

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



Så i funksjonen har vi en stat -struktur der dataene eller informasjonen om filen lagres som bruker en peker som heter buf, som sendes inn som et parameter og fylles ut under utførelsen av samtalen og kan leses av brukeren etter samtalen.

Statens struktur:

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

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_størrelse;
strukturtimspec st_atim;
strukturtimspec st_mtim;
strukturtimspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
};

Beskrivelse:

  1. st_dev: Det er ID -en til enheten der vi har filen vår.
  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. Siden det er et indeksnummer, bør det være unikt for alle filer
  4. st_size: st_size er størrelsen på filen i byte.
  5. st_atime: Det er siste eller siste gangen filen ble åpnet.
  6. st_ctime: Det er den siste tiden da statusen eller tillatelsene til filen ble endret.
  7. st_mtime: Det er den siste tiden da 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 totalt antall blokker i multipler på 512 byte.
  10. st_nlink: Dette feltet forteller totalt antall harde lenker.
  11. st_uid: Dette feltet angir bruker -ID.
  12. st_gid: Dette feltet angir gruppe -ID.
  13. st_mode: Den angir tillatelsene til filen, forteller modusene for en fil. Følgende er flaggene som skal defineres for st_mode -feltet:
Flagg Beskrivelse Flagg verdi
S_IFMT En bitmaske som brukes til å få modusverdi for en fil 0170000
S_IFSOCK En filkonstant for socket 0140000
S_IFLINK En filkonstant med symbolsk lenke 0120000
S_IFREG Filkonstant for vanlig fil 0100000
S_IFBLK Filkonstant for blokkfil 0060000
S_IFDIR Filkonstant for katalogfil 0040000
S_IFCHR Filkonstant for tegnfil 0020000
S_IFIFO En filkonstant på fifo 0010000
S_ISUID Angi bruker -ID -bit 0004000
S_ISGID Angi gruppe -ID -bit 0002000
S_ISVTX Klissete bit som indikerer delt tekst 0001000
S_IRWXU Eiertillatelser (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 eieren 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 gruppen 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

Slik bruker du Stat -systemanrop:

Følgende eksempel viser hvordan du bruker stat systemanrop i C -programmeringsspråk i Linux, Ubuntu.

EKSEMPEL 1:

I den følgende koden skal vi finne modusen for en fil:

KODE:

#inkludere
#inkludere
inthoved-()
{
// peker til stat struct
strukturstaten sfile;

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

// tilgang til st_mode (data medlem av stat struct)
printf ('st_mode = %o',sfile.st_mode);
komme tilbake 0;
}

Kompilering og kjøring av programmet returnerer som følger:

I denne koden har vi passert navnet på filen i stat systemanrop og deretter pekeren til stat struct som er sfile. Pekeren til stat struct brukes deretter til å få tilgang til st_mode som viser filens modus ved hjelp av printf -setning.

Toppfilen brukes slik at du kan bruke stat systemanrop. Hovedfilen er standard input/output bibliotekfil, slik at du kan bruke printf eller scanf i C -koden.

EKSEMPEL 2:

I den følgende koden skal vi få informasjon om filen ved hjelp av stat systemanrop:

KODE:

#inkludere
#inkludere
#inkludere
#inkludere

tomromsfile(røye konstfilnavn[]);

inthoved-(){
størrelse_t lest;
røye*buffer= 0;
størrelse_tbuf_størrelse= 0;

printf ('Skriv inn navnet på en fil for å kontrollere: n');
lese=getline(&buffer, &buf_størrelse,stdin);

hvis (lese<=0 ){
printf ('getline mislyktes n');
exit (1);
}

hvis (buffer[lese-1] == ' n'){
buffer[lese-1] = 0;
}

ints=åpen(buffer,O_RDONLY);
hvis(s== -1){
printf ('Filen eksisterer ikke n');
exit (1);
}
ellers{
sfile(buffer);
}
gratis (buffer);
komme tilbake 0;
}

tomromsfile(røye konstfilnavn[]){

strukturstaten sfile;

hvis(stat(filnavn, &sfile)== -1){
printf ('Feil oppsto n');
}

// Tilgang til data medlemmer av stat struct
printf (' nFil st_uid %d n',sfile.st_uid);
printf (' nFil st_blksize %ld n',sfile.st_blksize);
printf (' nFil st_gid %d n',sfile.st_gid);
printf (' nFil st_blocks %ld n',sfile.st_blocks);
printf (' nFil st_size %ld n',sfile.st_størrelse);
printf (' nFil st_nlink% u n',(usignert int)sfile.st_nlink);
printf (' nBruker for filtillatelser 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 (' nGruppe for filtillatelser 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 (' nFiltillatelser Annet n');
printf ((sfile.st_mode &S_IROTH)? 'r':'-');
printf ((sfile.st_mode &S_IWOTH)? 'i':'-');
printf ((sfile.st_mode &S_IXOTH)? 'x':'-');
printf (' n');
}

PRODUKSJON:

I C -koden ovenfor har vi angitt filnavnet, og hvis filen ikke eksisterer, stoppes utførelsen av programmet. Dette er demonstrert i følgende bilde:

Hvis filen vår eksisterer, vil funksjonen sfile (n) bli kalt der vi har passert navnet på filen. Inne i funksjonen, først og fremst har vi brukt Stat -systemanrop, hvis stat () returnerer -1, må det være en feil, så en melding skrives ut og utførelsen av programmet stoppes.

Så i printf -setningen har vi brukt navnet på funksjonen og prikseparatoren for å få tilgang til datamedlemmene til stat struktur .

Så for filmodus har vi fått tilgang til makroene eller flaggene til st_mode. Her brukes logisk og operator for å skrive ut de respektive modusene. Vi har sjekket for tillatelser for bruker, gruppe og andre for den angitte filen (filnavn angitt av bruker).

Med dette kan du se hvordan du bruker stat systemanrop fra programmeringsspråket C for å få informasjon fra OS -kjernen om filer. Hvis du har et spørsmål, vennligst gi oss beskjed via kommentarfeltet.