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:
#includeStat 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
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:
- st_dev: To je ID naprave, v kateri imamo trenutno datoteko.
- st_rdev: To polje opisuje, da določena datoteka predstavlja določeno napravo.
- st_ino: To je številka inode ali serijska številka datoteke. Ker gre za indeksno številko, bi morala biti za vse datoteke enolična
- st_size: st_size je velikost datoteke v bajtih.
- st_atime: To je zadnji ali zadnji čas dostopa do datoteke.
- st_ctime: To je zadnji čas, ko se je spremenilo stanje ali dovoljenja datoteke.
- st_mtime: To je zadnji čas, ko je bila datoteka spremenjena.
- st_blksize: To polje daje želeno velikost bloka za V / I datotečni sistem, ki se lahko razlikuje od datoteke do datoteke.
- st_blocks: To polje pove skupno število blokov v večkratnikih 512 bajtov.
- st_nlink: To polje pove skupno število trdih povezav.
- st_uid: To polje označuje ID uporabnika.
- st_gid: To polje označuje ID skupine.
- 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
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.