Sistemski klici

Stat System Call Vadnica za Linux

Stat System Call Vadnica za Linux

Klici sistema Linux

Sistemski klici, ki jih omogoča jedro linux, so v programskem jeziku C izpostavljeni prek glibc.  Ko je uporabljen sistemski klic, komunicirate z operacijskim sistemom in po vrnitvi vas OS komunicira s parametri, ki se vrnejo v funkcije sistemskih klicev (povratne vrednosti).

Stat sistemski klic:

Sistemski klic Stat je sistemski klic v Linuxu za preverjanje stanja datoteke, na primer za preverjanje, kdaj je bila datoteka dostopna. Sistemski klic stat () dejansko vrne atribute datoteke. Atribute datoteke inode v bistvu vrne funkcija Stat (). Inode vsebuje metapodatke datoteke. Inode vsebuje: vrsto datoteke, velikost datoteke, kdaj je bila datoteka dostopna (spremenjena, izbrisana), to so časovni žigi, in pot 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 indeksna številka datoteke, ki je shranjena v tabeli inode. Vsakič, ko ustvarite datoteko, se ustvari številka inode za to datoteko. 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:

#include

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

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

Vrnjeni tip funkcije v int, če se funkcija uspešno izvede, se vrne 0, če pride do napak, se vrne -1.

Tukaj const char * pot določa ime datoteke. Če je pot do datoteke simbolična povezava, morate namesto imena datoteke določiti povezavo.

Potem imamo v funkciji a stat struktura v katerem so shranjeni podatki ali informacije o datoteki, ki uporablja poimenovan kazalec buf, ki se odda kot parameter in izpolni med izvajanjem klica in ga uporabnik po klicu prebere.

Stat struktura:

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

strukt stat

način_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;
;

Opis:

  1. st_dev: To je ID naprave, v kateri imamo trenutno 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 gre za indeksno številko, bi morala biti za vse datoteke enolična
  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: To je zadnji čas, ko se je spremenilo stanje 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 V / I datotečni sistem, ki se lahko razlikuje od datoteke do datoteke.
  9. st_blocks: To polje pove skupno število blokov v večkratnikih 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 in pove načine v datoteki. Sledijo zastavice, ki jih je treba definirati za polje st_mode:
Zastave Opis Vrednost zastave
S_IFMT Bitna maska, ki se uporablja za pridobitev vrednosti načina datoteke 0170000
S_IFSOCK Datotečna konstanta vtičnice 0140000
S_IFLINK Datotečna konstanta simbolične povezave 0120000
S_IFREG Datoteka konstanta za navadno datoteko 0100000
S_IFBLK Datoteka konstanta za datoteko bloka 0060000
S_IFDIR Datotečna konstanta za imeniško datoteko 0040000
S_IFCHR Datotečna konstanta za datoteko znakov 0020000
S_IFIFO Datotečna konstanta fifo 0010000
S_ISUID Nastavite bit ID uporabnika 0004000
S_ISGID Nastavite bit ID skupine 0002000
S_ISVTX Lepljivi bit, ki označuje besedilo v skupni rabi 0001000
S_IRWXU Lastniška dovoljenja (branje, pisanje, izvajanje) 00700
S_IRUSR Preberite Dovoljenja za lastnika 00400
S_IWUSR Napišite dovoljenja za lastnika 00200
S_IXUSR Izvedi dovoljenja za lastnika 00100
S_IRWXG Skupinska dovoljenja (branje, pisanje, izvajanje) 00070
S_IRGRP Preberite Dovoljenja za skupino 00040
S_IWGRP Napišite dovoljenja za skupino 00020
S_IXGRP Izvedi dovoljenja za skupino 00010
S_IRWXO Dovoljenja za druge (branje, pisanje, izvajanje) 00007
S_IROTH Preberite dovoljenja za druge 00004
S_IWOTH Napišite dovoljenja 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:

#include
#include
int main ()

// kazalec na stat struct
struct stat sfile;
// sistemski klic stat
stat ("stat.c ", & sfile);
// dostop do st_mode (podatkovni član stat struct)
printf ("st_mode =% o", sfile.st_mode);
vrnitev 0;

Prevajanje in zagon programa vrne, kot je prikazano spodaj:

V tej kodi smo v sistemski klic stat predali ime datoteke in nato kazalec na stat struct, ki je sfile. Kazalec na stat struct se nato uporablja za dostop do st_mode, ki s pomočjo stavka printf prikaže način datoteke.

Datoteka glave se uporablja, tako da lahko uporabite sistemski klic stat. Datoteka glave je standardna vhodno / izhodna datoteka knjižnice, tako da lahko v kodo C uporabite printf ali scanf.

PRIMER 2:

V naslednji kodi bomo dobili informacije o datoteki s pomočjo sistemskega klica stat:

KODA:

#include
#include
#include
#include
void sfile (char const ime datoteke []);
int main ()
ssize_t branje;
char * medpomnilnik = 0;
size_t buf_size = 0;
printf ("Vnesite ime datoteke za preverjanje: \ n");
read = getline (& buffer, & buf_size, stdin);
če (beri <=0 )
printf ("getline ni uspel \ n");
izhod (1);

če (medpomnilnik [read-1] == '\ n')
medpomnilnik [branje-1] = 0;

int s = odprto (medpomnilnik, O_RDONLY);
če (s == - 1)
printf ("Datoteka ne obstaja \ n");
izhod (1);

sicer
sfile (medpomnilnik);

brezplačno (medpomnilnik);
vrnitev 0;

void sfile (char const ime datoteke [])
Datoteka struct stat;
if (stat (ime datoteke & & datoteka) == - 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", (unsigned int) sfile.st_nlink);
printf ("\ nFile User Permissions User \ 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 Group Permissions 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 ("\ nDovoljenja za datoteke \ n");
printf ((sfile.st_mode & S_IROTH)? "r": "-");
printf ((sfile.st_mode & S_IWOTH)? "w": "-");
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 katero smo poslali ime datoteke. Znotraj funkcije smo najprej uporabili sistemski klic Stat, če stat () vrne -1, potem mora obstajati kakršna koli napaka, da bo natisnjeno sporočilo in ustavljeno izvajanje programa.

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

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

S tem lahko vidite, kako s sistemskim klicem stat iz programskega jezika C pridobiti informacije iz jedra OS o datotekah.  Če imate vprašanje, nam to sporočite preko komentarja.

Najboljši emulatorji igralne konzole za Linux
V tem članku bo navedena priljubljena programska oprema za emulacijo igralne konzole, ki je na voljo za Linux. Emulacija je sloj združljivosti program...
Najboljši Linux Distros za igre na srečo v letu 2021
Operacijski sistem Linux je daleč od prvotnega, preprostega, strežniškega videza. Ta OS se je v zadnjih letih izjemno izboljšal in se je zdaj razvil v...
Kako zajeti in pretakati svojo igralno sejo v Linuxu
V preteklosti je bilo igranje iger le hobi, sčasoma pa je igralniška industrija zabeležila veliko rast glede tehnologije in števila igralcev. Občinstv...