Systémové volania poskytované linuxovým jadrom sú vystavené v programovacom jazyku C prostredníctvom glibc. Keď sa použije systémové volanie, komunikujete s OS a pri návrate vám OS komunikuje prostredníctvom parametrov, ktoré sú vrátené funkciám systémového volania (návratové hodnoty).
Stat System Call:
Stat system call je systémové volanie v Linuxe na kontrolu stavu súboru, napríklad na kontrolu, kedy bol súbor prístupný. Systémové volanie stat () skutočne vracia atribúty súborov. Atribúty súboru inodu sú v zásade vrátené funkciou Stat (). Inode obsahuje metadáta súboru. Inode obsahuje: typ súboru, veľkosť súboru, ku ktorému bol súbor prístupný (upravený, odstránený), tj časové pečiatky, a cestu k súboru, ID užívateľa a ID skupiny, prepojenia súboru a fyzickú adresu obsahu súboru.
Môžeme povedať, že inode obsahuje všetky údaje, ktoré sú potrebné pre systémové volanie stat (), a je to indexové číslo súboru, ktorý je uložený v tabuľke inode. Pri každom vytváraní súboru sa vytvorí číslo inodu pre tento súbor. Pomocou systému stat system call je možné zobraziť systémové tabuľky.
Syntax systémového volania C Stat:
Ak chcete používať systémové volanie stat v programovacom jazyku C, musíte zahrnúť nasledujúci súbor hlavičky:
#zahrnúť
Stat sa používa na získanie stavu súboru. Syntax systémového volania C stat nemusí byť rovnaká pre každý operačný systém. V systéme Linux je syntax pre systémové volanie stat nasledovná:
intštát(konšt char *cesta, Structštát*buf)
Návratový typ funkcie v int, ak je funkcia úspešne vykonaná, vráti sa 0, ak sa vyskytnú chyby, vráti sa -1.
Tu cesta const char * určuje názov súboru. Ak je cesta k súboru symbolickým odkazom, musíte namiesto názvu súboru zadať odkaz.
Potom vo funkcii máme štatistickú štruktúru, v ktorej sú uložené údaje alebo informácie o súbore, ktorá používa ukazovateľ s názvom bufet, ktorý je odovzdaný ako parameter a je vyplnený počas vykonávania hovoru a je čitateľný pre používateľa po ukončení hovoru.
Štruktúra štatistiky:
Štruktúra štatistiky definovaná v hlavičkovom súbore obsahuje nasledujúce polia:
Structštát{
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;
};
Popis:
- st_dev: Je to ID zariadenia, v ktorom sa momentálne nachádza náš súbor.
- st_rdev: Toto pole popisuje, že konkrétny súbor predstavuje konkrétne zariadenie.
- st_ino: Je to číslo inodu alebo sériové číslo súboru. Keďže ide o indexové číslo, malo by byť jedinečné pre všetky súbory
- veľkosť_veľkosti: st_size je veľkosť súboru v bajtoch.
- st_atime: Je to posledný alebo posledný čas, kedy bol súbor sprístupnený.
- st_ctime: Je to nedávny čas, kedy bol zmenený stav alebo povolenia súboru.
- st_mtime: Je to nedávny čas, kedy bol súbor upravený.
- st_blksize: Toto pole udáva preferovanú veľkosť bloku pre súborový systém I/O, ktorá sa môže líšiť od súboru k súboru.
- st_blocks: Toto pole udáva celkový počet blokov v násobkoch 512 bajtov.
- st_nlink: Toto pole udáva celkový počet pevných odkazov.
- st_uid: Toto pole označuje ID užívateľa.
- st_gid: Toto pole označuje ID skupiny.
- st_mode: Udáva povolenia v súbore a uvádza režimy v súbore. Nasledujú príznaky, ktoré by mali byť definované pre pole st_mode:
Vlajky | Popis | Hodnota vlajky |
---|---|---|
S_IFMT | Bitová maska používaná na získanie hodnoty režimu súboru | 0170000 |
S_IFSOCK | Súborová konštanta soketu | 0140000 |
S_IFLINK | Súborová konštanta symbolického odkazu | 0120000 |
S_IFREG | Konštanta súboru pre bežný súbor | 0100000 |
S_IFBLK | Konštanta súboru pre súbor bloku | 0060000 |
S_IFDIR | Konštanta súboru pre súbor adresára | 0040000 |
S_IFCHR | Konštanta súboru pre súbor znakov | 0020000 |
S_IFIFO | Súborová konštanta fifo | 0010000 |
S_ISUID | Nastavte bit User ID | 0004000 |
S_ISGID | Nastavte bit ID skupiny | 0002000 |
S_ISVTX | Lepkavý bit, ktorý označuje zdieľaný text | 0001000 |
S_IRWXU | Povolenia vlastníka (čítanie, zápis, spustenie) | 00700 |
S_IRUSR | Prečítajte si Povolenia pre vlastníka | 00400 |
S_IWUSR | Napíšte povolenia pre vlastníka | 00200 |
S_IXUSR | Vykonať povolenia pre vlastníka | 00100 |
S_IRWXG | Skupinové povolenia (čítanie, zápis, spustenie) | 00070 |
S_IRGRP | Prečítajte si Povolenia pre skupinu | 00040 |
S_IWGRP | Napíšte povolenia pre skupinu | 00020 |
S_IXGRP | Vykonať povolenia pre skupinu | 00010 |
S_IRWXO | Povolenia pre ostatných (čítanie, zápis, spustenie) | 00007 |
S_IROTH | Prečítajte si Povolenia pre ostatných | 00004 |
S_IWOTH | Napíšte povolenia pre ostatných | 00002 |
S_IXOTH | Vykonať povolenia pre ostatných | 00001 |
Ako používať systémové volanie Stat:
Nasledujúci príklad ukazuje, ako používať systémové volanie stat v programovacom jazyku C v Linuxe, Ubuntu.
PRÍKLAD 1:
V nasledujúcom kóde nájdeme režim súboru:
KÓD:
#zahrnúť#zahrnúť
intHlavná()
{
// ukazovateľ na stat struct
Structštátny súbor;
// systémové systémové volanie
štát('stat.c', &sfile);
// prístup k st_mode (dátový člen štatistickej štruktúry)
printf ('st_mode = %o',sfile.st_mode);
vrátiť sa 0;
}
Kompilácia a spustenie programu sa vráti takto:
V tomto kóde sme zadali názov súboru v systémovom volaní stat a potom ukazovateľ na stat struct, ktorý je sfile. Štruktúra ukazovateľa na stat sa potom použije na prístup k st_mode, ktorý zobrazuje režim súboru pomocou príkazu printf.
Používa sa hlavičkový súbor, takže môžete použiť systémové volanie stat. Hlavičkový súbor je štandardný súbor vstupnej/výstupnej knižnice, takže v kóde C môžete použiť printf alebo scanf.
PRÍKLAD 2:
V nasledujúcom kóde získame informácie o súbore pomocou systémového volania stat:
KÓD:
#zahrnúť#zahrnúť
#zahrnúť
#zahrnúť
prázdnysfile(char konštnázov súboru[]);
intHlavná(){
ssize_t prečítané;
char*nárazník= 0;
veľkosť_tbuf_size= 0;
printf ('Zadajte názov súboru, ktorý chcete skontrolovať: n');
čítať=getline(&nárazník, &buf_size,stdin);
keby (čítať<=0 ){
printf ('getline zlyhal n');
východ (1);
}
keby (nárazník[čítať-1] == ' n'){
nárazník[čítať-1] = 0;
}
ints=otvorené(nárazník,O_RDONLY);
keby(s== -1){
printf („Súbor neexistuje n');
východ (1);
}
inak{
sfile(nárazník);
}
zadarmo (nárazník);
vrátiť sa 0;
}
prázdnysfile(char konštnázov súboru[]){
Structštátny súbor;
keby(štát(názov súboru, &sfile)== -1){
printf ('Vyskytla sa chyba n');
}
// Prístup k dátovým členom stat struct
printf (' nSúbor st_uid %d n',sfile.st_uid);
printf (' nSúbor st_blksize %ld n',sfile.st_blksize);
printf (' nSúbor st_gid %d n',sfile.st_gid);
printf (' nSúbor st_blocks %ld n',sfile.st_blocks);
printf (' nSúbor st_size %ld n',sfile.st_size);
printf (' nSúbor st_nlink% u n',(bez znamienka int)sfile.st_nlink);
printf (' nPoužívateľ povolení súboru 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 povolení súborov 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 (' nPovolenia na súbor Iné n');
printf ((sfile.st_mode &S_IROTH)? 'r':'-');
printf ((sfile.st_mode &S_IWOTH)? 'in':'-');
printf ((sfile.st_mode &S_IXOTH)? 'X':'-');
printf (' n');
}
VÝKON:
Do vyššie uvedeného kódu C sme zadali názov súboru a ak súbor neexistuje, spustenie programu sa zastaví. To je znázornené na nasledujúcom obrázku:
Ak náš súbor existuje, bude sa volať funkcia sfile (n), v ktorej sme zadali názov súboru. Vo funkcii sme predovšetkým použili systémové volanie Stat, ak stat () vráti -1, potom musí existovať každá chyba, takže sa vytlačí správa a zastaví sa vykonávanie programu.
Potom sme v príkaze printf použili názov funkcie a oddeľovača bodiek na prístup k dátovým členom súboru štatistická štruktúra .
Potom sme pre režim súboru pristúpili k makrám alebo príznakom st_mode. Tu sa na tlač príslušných režimov používa logický a operátor. Skontrolovali sme povolenia pre používateľa, skupinu a ďalšie pre zadaný súbor (názov súboru zadaný používateľom).
Vďaka tomu môžete vidieť, ako používať systémové volanie statov z programovacieho jazyka C na získavanie informácií z jadra OS o súboroch. Ak máte otázku, neváhajte nám ju napísať prostredníctvom sekcie komentárov.