Stat System Call Linux Tutorial

Stat System Call Linux Tutorial



Systemopkald leveret af linuxkernen udsættes for C -programmeringssproget via glibc. Når der bruges et systemopkald, kommunikerer du til operativsystemet, og når systemet vender tilbage, kommunikerer det til dig via de parametre, der returneres til systemopkaldsfunktioner (returværdier).

Stat Systemopkald:

Stat systemopkald er et systemopkald i Linux for at kontrollere status for en fil, f.eks. For at kontrollere, hvornår filen blev åbnet. Systemopkaldet stat () returnerer faktisk filattributter. Filattributterne for en inode returneres dybest set af funktionen Stat (). En inode indeholder filens metadata. En inode indeholder: filtypen, filens størrelse, hvornår filen blev åbnet (ændret, slettet), der er tidsstempler, og filens sti, bruger -id og gruppe -id, links til filen , og fysisk adresse på filindhold.







Vi kan sige, at inode indeholder alle de data, der er nødvendige for stat () systemopkald, og det er indeksnummeret for filen, der er gemt i inode -tabellen. Når du opretter en fil, oprettes et inode -nummer for den fil. Ved hjælp af stat systemopkald kan systemtabellerne ses.



Syntaks for C Stat -systemopkald:

For at bruge stat systemopkald i C -programmeringssprog skal du inkludere følgende headerfil:



#omfatte

Stat bruges til at få status for en fil. Syntaksen for C stat -systemopkald er muligvis ikke den samme for hvert operativsystem. I Linux er syntaksen for stat systemopkald som følger:





intstat(konst forkælelse *sti, strukturstat*buf)

Funktionens returtype i int, hvis funktionen udføres med succes, returneres 0, hvis der er fejl, -1 returneres.

Her const char *sti angiver navnet på filen. Hvis filens sti er et symbolsk link, skal du angive linket i stedet for filnavn.



Så i funktionen har vi en stat -struktur, hvor data eller oplysninger om filen er gemt, som bruger en markør med navnet buf, som sendes ind som parameter og udfyldes under udførelsen af ​​opkaldet og kan læses af brugeren efter opkaldet.

Statens struktur:

Statstrukturen, der er defineret i header -fil, indeholder følgende felter:

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'et på den enhed, hvor vi har vores fil i øjeblikket.
  2. st_rdev: Dette felt beskriver, at en bestemt fil repræsenterer en bestemt enhed.
  3. st_ino: Det er filens inode -nummer eller serienummer. Da det er et indeksnummer, bør det være unikt for alle filer
  4. st_size: st_size er størrelsen på filen i bytes.
  5. st_atime: Det er sidste gang eller det seneste tidspunkt, hvor filen blev åbnet.
  6. st_ctime: Det er det seneste tidspunkt, hvor status eller tilladelser for filen blev ændret.
  7. st_mtime: Det er det seneste tidspunkt, hvor filen blev ændret.
  8. st_blksize: Dette felt giver den foretrukne blokstørrelse til I/O -filsystem, som kan variere fra fil til fil.
  9. st_blocks: Dette felt fortæller det samlede antal blokke i multipla af 512 bytes.
  10. st_nlink: Dette felt fortæller det samlede antal hårde links.
  11. st_uid: Dette felt angiver bruger -id'et.
  12. st_gid: Dette felt angiver gruppens id.
  13. st_mode: Det angiver tilladelserne til filen, fortæller tilstande på en fil. Følgende er de flag, der skal defineres for st_mode -feltet:
Flag Beskrivelse Markér værdi
S_IFMT En bitmaske bruges til at få tilstandsværdi for en fil 0170000
S_IFSOCK En filkonstant af stikket 0140000
S_IFLINK En filkonstant med symbolsk link 0120000
S_IFREG Filkonstant for almindelig fil 0100000
S_IFBLK Filkonstant for blokfil 0060000
S_IFDIR Filkonstant for biblioteksfil 0040000
S_IFCHR Filkonstant for tegnfil 0020000
S_IFIFO En filkonstant på fifo 0010000
S_ISUID Indstil bruger -ID bit 0004000
S_ISGID Indstil gruppe -ID bit 0002000
S_ISVTX Sticky bit, der angiver delt tekst 0001000
S_IRWXU Ejer tilladelser (læs, skriv, udfør) 00700
S_IRUSR Læs tilladelser til ejer 00400
S_IWUSR Skriv tilladelser til ejer 00200
S_IXUSR Udfør tilladelser for ejeren 00100
S_IRWXG Gruppetilladelser (læs, skriv, udfør) 00070
S_IRGRP Læs tilladelser til gruppe 00040
S_IWGRP Skriv tilladelser til gruppe 00020
S_IXGRP Udfør tilladelser for gruppen 00010
S_IRWXO Tilladelser til andre (læs, skriv, udfør) 00007
S_IROTH Læs tilladelser til andre 00004
S_IWOTH Skriv tilladelser til andre 00002
S_IXOTH Udfør tilladelser for andre 00001

Sådan bruges Stat -systemopkald:

Følgende eksempel viser, hvordan du bruger stat systemopkald i C -programmeringssprog i Linux, Ubuntu.

EKSEMPEL 1:

I den følgende kode finder vi filens tilstand:

KODE:

#omfatte
#omfatte
intvigtigste()
{
// markør til stat struct
strukturstat sfile;

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

// adgang til st_mode (data medlem af stat struct)
printf ('st_mode = %o',sfile.st_mode);
Vend tilbage 0;
}

Kompilering og kørsel af programmet vender tilbage som nedenfor:

I denne kode har vi passeret navnet på filen i stat systemopkald og derefter markøren til stat struct, som er sfile. Markøren til stat struct bruges derefter til at få adgang til st_mode, som viser filens tilstand ved hjælp af printf -sætning.

Hovedfilen bruges, så du kan bruge stat systemopkald. Hovedfilen er standard input/output biblioteksfil, så du kan bruge printf eller scanf i din C -kode.

EKSEMPEL 2:

I den følgende kode får vi oplysninger om filen ved hjælp af stat systemopkald:

KODE:

#omfatte
#omfatte
#omfatte
#omfatte

ugyldigsfile(forkælelse konstfilnavn[]);

intvigtigste(){
størrelse_t læst;
forkælelse*buffer= 0;
størrelse_tbuf_størrelse= 0;

printf ('Indtast navnet på en fil for at kontrollere: n');
Læs=getline(&buffer, &buf_størrelse,stdin);

hvis (Læs<=0 ){
printf ('getline mislykkedes n');
Afslut (1);
}

hvis (buffer[Læs-1] == ' n'){
buffer[Læs-1] = 0;
}

ints=åben(buffer,O_RDONLY);
hvis(s== -1){
printf ('Filen findes ikke n');
Afslut (1);
}
andet{
sfile(buffer);
}
gratis (buffer);
Vend tilbage 0;
}

ugyldigsfile(forkælelse konstfilnavn[]){

strukturstat sfile;

hvis(stat(filnavn, &sfile)== -1){
printf ('Der er sket en fejl n');
}

// Adgang til data medlemmer af 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',(usigneret int)sfile.st_nlink);
printf (' nBruger af filtilladelser 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 filtilladelser 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 (' nAndre filtilladelser 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 ovenstående C -kode har vi indtastet filnavnet, og hvis filen ikke findes, stoppes udførelsen af ​​programmet. Dette er demonstreret i følgende billede:

Hvis vores fil eksisterer, kaldes funktionen sfile (n), hvor vi har videregivet filens navn. Inde i funktionen har vi først og fremmest brugt Stat -systemopkald, hvis stat () returnerer -1, skal der være en fejl, så en meddelelse udskrives, og udførelsen af ​​programmet stoppes.

Så i printf -sætning har vi brugt navnet på funktion og prikseparator for at få adgang til datamedlemmerne i stat struktur .

Så for filtilstanden har vi haft adgang til makroerne eller flagene i st_mode. Her bruges logisk og operator til at udskrive de respektive tilstande. Vi har kontrolleret for tilladelser for bruger, gruppe og andre for den angivne fil (filnavn indtastet af bruger).

Med dette kan du se, hvordan du bruger stat systemopkald fra programmeringssproget C til at få information fra OS -kernen om filer. Hvis du har et spørgsmål, er du velkommen til at fortælle os det via kommentarfeltet.