Vadnica za sistemski klic sistema Stat

Stat System Call Linux Tutorial



Sistemski klici, ki jih zagotavlja jedro linux, so v programskem jeziku C predstavljeni prek glibc. Ko uporabljate sistemski klic, komunicirate z operacijskim sistemom in ob vrnitvi operacijski sistem komunicira z vami prek parametrov, ki so vrnjeni v funkcije sistemskega klica (povratne vrednosti).

Klic sistema Stat:

Sistemski klic Stat je sistemski klic v sistemu Linux za preverjanje stanja datoteke, na primer za preverjanje, kdaj je do datoteke prišlo. Sistemski klic stat () dejansko vrne atribute datotek. Atribute datoteke inode v bistvu vrne funkcija Stat (). Inode vsebuje metapodatke datoteke. Inode vsebuje: vrsto datoteke, velikost datoteke, kdaj je bil do datoteke dostopen (spremenjen, izbrisan), to so časovni žigi, pot do datoteke, ID uporabnika in ID skupine, povezave do datoteke in fizični naslov vsebine datoteke.







Lahko rečemo, da inode vsebuje vse podatke, ki so potrebni za sistemski klic stat (), in je številka indeksa za datoteko, ki je shranjena v tabeli inode. Kadar koli ustvarite datoteko, se za to datoteko ustvari številka inode. S sistemskim klicem stat si lahko ogledate sistemske tabele.



Sintaksa sistemskega klica C Stat:

Če želite uporabiti sistemski klic stat v programskem jeziku C, morate vključiti naslednjo datoteko glave:



#vključi

Stat se uporablja za pridobitev statusa datoteke. Sintaksa sistemskega klica C stat morda ni enaka za vsak operacijski sistem. V Linuxu je sintaksa za sistemski klic stat naslednja:





intdržava(const char *pot, structdržava*buf)

Vrsta funkcije v int, če je funkcija uspešno izvedena, se vrne 0, če pride do napak, vrne se -1.

Tukaj const char *pot podaja ime datoteke. Če je pot datoteke simbolična povezava, morate namesto imena datoteke navesti povezavo.



Nato v funkciji imamo strukturo stat, v kateri so shranjeni podatki ali informacije o datoteki, ki uporablja kazalec z imenom buf, ki se posreduje kot parametater in se izpolni med izvajanjem klica in ga uporabnik po klicu lahko prebere.

Statistična struktura:

Struktura stat, ki je definirana v datoteki glave, vsebuje naslednja polja:

structdržava
{
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;
structtimspec st_atim;
structtimspec st_mtim;
structtimspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
};

Opis:

  1. st_dev: To je ID naprave, v kateri imamo trenutno shranjeno datoteko.
  2. st_rdev: To polje opisuje, da določena datoteka predstavlja določeno napravo.
  3. st_ino: To je številka inode ali serijska številka datoteke. Ker je indeksna številka, mora biti edinstvena za vse datoteke
  4. st_size: st_size je velikost datoteke v bajtih.
  5. st_atime: To je zadnji ali zadnji čas dostopa do datoteke.
  6. st_ctime: Zadnji čas je bil spremenjen status ali dovoljenja datoteke.
  7. st_mtime: To je zadnji čas, ko je bila datoteka spremenjena.
  8. st_blksize: To polje daje želeno velikost bloka za datotečni sistem V/I, ki se lahko razlikuje od datoteke do datoteke.
  9. st_blocks: To polje pove skupno število blokov, večkratnih 512 bajtov.
  10. st_nlink: To polje pove skupno število trdih povezav.
  11. st_uid: To polje označuje ID uporabnika.
  12. st_gid: To polje označuje ID skupine.
  13. st_mode: Označuje dovoljenja za datoteko, pove načine za datoteko. Spodaj so zastavice, ki jih je treba določiti za polje st_mode:
Zastave Opis Vrednost zastavice
S_IFMT Bitna maska, ki se uporablja za pridobivanje vrednosti načina datoteke 0170000
S_IFSOCK Datoteka konstanta vtičnice 0140000
S_IFLINK Datoteka konstante simbolične povezave 0120000
S_IFREG Datoteka konstanta za običajno datoteko 0100000
S_IFBLK Datoteka konstanta za datoteko bloka 0060000
S_IFDIR Datoteka konstanta za datoteko imenika 0040000
S_IFCHR Datoteka konstanta za datoteko znakov 0020000
S_IFIFO Datoteka konstanta fifo 0010000
S_ISUID Nastavite bit User ID 0004000
S_ISGID Nastavite bit ID skupine 0002000
S_ISVTX Lepljiv bit, ki označuje besedilo v skupni rabi 0001000
S_IRWXU Dovoljenja lastnika (branje, pisanje, izvajanje) 00700
S_IRUSR Dovoljenja za branje lastnika 00400
S_IWUSR Dovoljenja za pisanje lastnika 00200
S_IXUSR Izvedite dovoljenja za lastnika 00100
S_IRWXG Skupinska dovoljenja (branje, pisanje, izvajanje) 00070
S_IRGRP Dovoljenja za branje za skupino 00040
S_IWGRP Dovoljenja za pisanje za skupino 00020
S_IXGRP Izvedite dovoljenja za skupino 00010
S_IRWXO Dovoljenja za druge (branje, pisanje, izvajanje) 00007
S_IROTH Dovoljenja za branje za druge 00004
S_IWOTH Dovoljenja za pisanje za druge 00002
S_IXOTH Izvedite dovoljenja za druge 00001

Kako uporabljati sistemski klic Stat:

Naslednji primer prikazuje, kako uporabljati sistemski klic stat v programskem jeziku C v Linuxu, Ubuntu.

PRIMER 1:

V naslednji kodi bomo našli način datoteke:

KODA:

#vključi
#vključi
intglavni()
{
// kazalec na stat struct
structdržavni sfile;

// stat sistemski klic
država('stat.c', &sfile);

// dostop do st_mode (podatkovni član stat struct)
printf ('st_mode = %o',sfile.st_mode);
vrnitev 0;
}

Sestavljanje in zagon programa se vrne na naslednji način:

V tej kodi smo v sistemskem klicu stat posredovali ime datoteke in nato kazalec na stat struct, ki je sfile. Kazalec na stat struct se nato uporabi za dostop do st_mode, ki prikaže način datoteke z uporabo stavka printf.

Glava se uporablja, tako da lahko uporabite sistemski klic stat. Naslovna datoteka je standardna vhodno/izhodna knjižnična datoteka, tako da lahko v svoji kodi C uporabite printf ali scanf.

PRIMER 2:

V naslednji kodi bomo s sistemskim klicem stat dobili informacije o datoteki:

KODA:

#vključi
#vključi
#vključi
#vključi

ničnosfile(char constIme datoteke[]);

intglavni(){
ssize_t preberi;
char*pufra= 0;
velikost_tbuf_size= 0;

printf ('Vnesite ime datoteke za preverjanje: n');
prebrati=getline(&pufra, &buf_size,stdin);

če (prebrati<=0 ){
printf ('getline ni uspel n');
izhod (1);
}

če (pufra[prebrati-1] == ' n'){
pufra[prebrati-1] = 0;
}

ints=odprto(pufra,O_RDONLY);
če(s== -1){
printf ('Datoteka ne obstaja n');
izhod (1);
}
drugače{
sfile(pufra);
}
prost (pufra);
vrnitev 0;
}

ničnosfile(char constIme datoteke[]){

structdržavni sfile;

če(država(Ime datoteke, &sfile)== -1){
printf ('Prišlo je do napake n');
}

// Dostop do podatkovnih članov stat struct
printf (' nDatoteka st_uid %d n',sfile.st_uid);
printf (' nDatoteka st_blksize %ld n',sfile.st_blksize);
printf (' nDatoteka st_gid %d n',sfile.st_gid);
printf (' nDatoteka st_blocks %ld n',sfile.st_blocks);
printf (' nDatoteka st_size %ld n',sfile.st_size);
printf (' nDatoteka st_nlink% u n',(brez podpisa int)sfile.st_nlink);
printf (' nUporabnik dovoljenj za datoteke n');
printf ((sfile.st_mode &S_IRUSR)? 'r':'-');
printf ((sfile.st_mode &S_IWUSR)? 'in':'-');
printf ((sfile.st_mode &S_IXUSR)? 'x':'-');
printf (' n');
printf (' nSkupina dovoljenj za datoteke n');
printf ((sfile.st_mode &S_IRGRP)? 'r':'-');
printf ((sfile.st_mode &S_IWGRP)? 'in':'-');
printf ((sfile.st_mode &S_IXGRP)? 'x':'-');
printf (' n');
printf (' nDovoljenja za datoteke Drugo n');
printf ((sfile.st_mode &S_IROTH)? 'r':'-');
printf ((sfile.st_mode &S_IWOTH)? 'in':'-');
printf ((sfile.st_mode &S_IXOTH)? 'x':'-');
printf (' n');
}

IZHOD:

V zgornjo kodo C smo vnesli ime datoteke in če datoteka ne obstaja, se bo izvajanje programa ustavilo. To je prikazano na naslednji sliki:

Če naša datoteka obstaja, bo poklicana funkcija sfile (n), v kateri smo posredovali ime datoteke. Znotraj funkcije smo najprej uporabili sistemski klic Stat, če stat () vrne -1, potem mora biti e kakršna koli napaka, da se natisne sporočilo in izvajanje programa ustavi.

Nato smo v stavku printf uporabili ime funkcije in ločila pik za dostop do podatkovnih članov stat struct .

Nato smo za način datoteke dostopali do makrov ali zastavic st_mode. Tu se logika in operator uporabljata za tiskanje ustreznih načinov. Preverili smo dovoljenja za uporabnika, skupino in druge za določeno datoteko (ime datoteke, ki jo je vnesel uporabnik).

S tem si lahko ogledate, kako s sistemskim klicem stat iz programskega jezika C dobiti informacije o datotekah iz jedra OS. Če imate vprašanje, nam to sporočite v razdelku s komentarji.