„Stat System Call Linux“ pamoka

Stat System Call Linux Tutorial



Sistemos skambučiai, kuriuos teikia „Linux“ branduolys, rodomi C programavimo kalba per „glibc“. Kai naudojamas sistemos skambutis, jūs bendraujate su OS, o grįžusi OS praneša jums per parametrus, kurie grąžinami į sistemos iškvietimo funkcijas (grąžinimo reikšmes).

Statinis sistemos skambutis:

„Stat system call“ yra sistemos skambutis sistemoje „Linux“, siekiant patikrinti failo būseną, pavyzdžiui, patikrinti, kada buvo pasiektas failas. Sistemos iškvietimas stat () iš tikrųjų grąžina failo atributus. Inode failo atributus iš esmės grąžina funkcija Stat (). Inode yra failo metaduomenys. „Inode“ yra: failo tipas, failo dydis, kai failas buvo pasiektas (pakeistas, ištrintas), tai yra laiko žymos, ir failo kelias, vartotojo ID ir grupės ID, failo nuorodos ir failo turinio fizinis adresas.







Galime pasakyti, kad „inode“ yra visi duomenys, reikalingi stat () sistemos iškvietimui, ir tai yra failo indekso numeris, išsaugotas inode lentelėje. Kai sukuriate failą, sukuriamas to failo inodo numeris. Naudojant stat sistemos iškvietimą galima peržiūrėti sistemos lenteles.



„C Stat“ sistemos skambučio sintaksė:

Norėdami naudoti sistemos sistemos iškvietimą C programavimo kalba, turite įtraukti šį antraštės failą:



#įtraukti

Stat naudojama failo būsenai gauti. „C stat“ sistemos skambučio sintaksė gali būti nevienoda kiekvienai operacinei sistemai. „Linux“ sistemoje sistemos iškvietimo sintaksė yra tokia:





tarptbūsena(konst anglis *kelias, strukturabūsena*buf)

Funkcijos grąžinimo tipas int, jei funkcija sėkmingai įvykdyta, grąžinama 0, jei yra klaidų, grąžinama -1.

Čia const char *kelias nurodo failo pavadinimą. Jei failo kelias yra simbolinė nuoroda, turite nurodyti nuorodą, o ne failo pavadinimą.



Tada funkcijoje turime statistinę struktūrą, kurioje saugomi duomenys ar informacija apie failą, naudojant rodyklę pavadinimu buf, kuris perduodamas kaip parametras ir užpildomas skambučio vykdymo metu, o vartotojas gali jį perskaityti po skambučio.

Statinė struktūra:

Antraštės faile apibrėžta statistinė struktūra apima šiuos laukus:

strukturabūsena
{
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;
strukturatimspec st_atim;
strukturatimspec st_mtim;
strukturatimspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
};

Apibūdinimas:

  1. st_dev: Tai yra įrenginio, kuriame šiuo metu yra failas, ID.
  2. st_rdev: Šiame lauke aprašoma, kad tam tikras failas reiškia tam tikrą įrenginį.
  3. st_ino: Tai failo įvesties numeris arba serijos numeris. Kadangi tai yra indekso numeris, jis turėtų būti unikalus visiems failams
  4. st_size: st_size yra failo dydis baitais.
  5. st_atime: Tai paskutinis arba paskutinis laikas, kai buvo pasiektas failas.
  6. st_ctime: Tai paskutinis laikas, kai buvo pakeista failo būsena ar leidimai.
  7. st_mtime: Tai paskutinis laikas, kai failas buvo modifikuotas.
  8. st_blksize: Šiame lauke pateikiamas pageidaujamas įvesties/išvesties failų sistemos bloko dydis, kuris gali skirtis priklausomai nuo failo.
  9. st_blocks: Šis laukas nurodo bendrą blokų skaičių 512 baitų kartotiniais.
  10. st_nlink: Šis laukas nurodo bendrą kietųjų nuorodų skaičių.
  11. st_uid: Šiame lauke nurodomas vartotojo ID.
  12. st_gid: Šiame lauke nurodomas grupės ID.
  13. st_mode: Tai rodo failo leidimus, nurodo failo režimus. Toliau pateikiamos st_mode lauko vėliavos:
Vėliavos apibūdinimas Vėliavos vertė
S_IFMT Bitų kaukė, naudojama failo režimo vertei gauti 0170000
S_IFSOCK Lizdo failo konstanta 0140000
S_IFLINK Simbolinės nuorodos failo konstanta 0120000
S_IFREG Failo konstanta įprastam failui 0100000
S_IFBLK Failo konstanta blokuojamam failui 0060000
S_IFDIR Katalogo failo konstanta 0040000
S_IFCHR Failų konstanta simbolių failams 0020000
S_IFIFO Failo konstanta - penki 0010000
S_ISUID Nustatykite „User ID“ bitą 0004000
S_ISGID Nustatykite grupės ID bitą 0002000
S_ISVTX Lipnus bitukas, nurodantis bendrinamą tekstą 0001000
S_IRWXU Savininko leidimai (skaityti, rašyti, vykdyti) 00700
S_IRUSR Skaitykite leidimus savininkui 00400
S_IWUSR Parašykite leidimus savininkui 00200
S_IXUSR Vykdyti leidimus savininkui 00100
S_IRWXG Grupės leidimai (skaityti, rašyti, vykdyti) 00070
S_IRGRP Skaitykite grupės leidimus 00040
S_IWGRP Rašykite leidimus grupei 00020
S_IXGRP Vykdyti grupės leidimus 00010
S_IRWXO Leidimai kitiems (skaityti, rašyti, vykdyti) 00007
S_IROTH Skaitykite leidimus kitiems 00004
S_IWOTH Rašykite leidimus kitiems 00002
S_IXOTH Vykdyti leidimus kitiems 00001

Kaip naudotis „Stat“ sistemos skambučiu:

Šiame pavyzdyje parodyta, kaip naudoti sistemos sistemos iškvietimą C programavimo kalba „Linux“, „Ubuntu“.

1 PAVYZDYS:

Šiame kode mes rasime failo režimą:

KODAS:

#įtraukti
#įtraukti
tarptpagrindinis()
{
// rodyklė į stat struktūrą
strukturabūsenos failas;

// stat sistemos skambutis
būsena('stat.c', &sfile);

// prieiga prie st_mode (duomenų struktūros narys)
printf ('st_mode = %o',sfile.st_mode);
grįžti 0;
}

Sukompiliuodami ir paleisdami programą grįšite taip:

Šiame kode mes perdavėme failo pavadinimą stat sistemos iškvietime, o tada rodyklę į stat struktūrą, kuri yra sfile. Tada rodyklė į stat struktūrą naudojama norint pasiekti st_mode, kuris rodo failo režimą naudojant printf sakinį.

Antraštės failas naudojamas, kad galėtumėte naudoti sistemos sistemos iškvietimą. Antraštės failas yra standartinis įvesties/išvesties bibliotekos failas, todėl savo C kode galite naudoti printf arba scanf.

2 PAVYZDYS:

Šiame kode mes gausime informacijos apie failą naudodami stat sistemos skambutį:

KODAS:

#įtraukti
#įtraukti
#įtraukti
#įtraukti

tuštumasfile(anglis konstfailo pavadinimas[]);

tarptpagrindinis(){
ssize_t skaityti;
anglis*buferis= 0;
dydis_tbuf_size= 0;

printf („Įveskite failo, kurį norite patikrinti, pavadinimą: n');
skaityti=getline(&buferis, &buf_size,stdin);

jei (skaityti<=0 ){
printf („getline“ nepavyko n');
išeiti (1);
}

jei (buferis[skaityti-1] == ' n'){
buferis[skaityti-1] = 0;
}

tarpts=atviras(buferis,O_RDONLY);
jei(s== -1){
printf ('Failas neegzistuoja n');
išeiti (1);
}
Kitas{
sfile(buferis);
}
Laisvas (buferis);
grįžti 0;
}

tuštumasfile(anglis konstfailo pavadinimas[]){

strukturabūsenos failas;

jei(būsena(failo pavadinimas, &sfile)== -1){
printf ('Įvyko klaida n');
}

// Prieiga prie duomenų struktūros narių
printf (' nFailas st_uid %d n',sfile.st_uid);
printf (' nFailas st_blksize %ld n',sfile.st_blksize);
printf (' nFailas st_gid %d n',sfile.st_gid);
printf (' nFailas st_blocks %ld n',sfile.st_blocks);
printf (' nFailas st_size %ld n',sfile.st_size);
printf (' nFailas st_nlink% u n',(nepasirašytas tarpt)sfile.st_nlink);
printf (' nFailų leidimų vartotojas 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 (' nFailų leidimų grupė 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 (' nFailų leidimai Kiti n');
printf ((sfile.st_mode &S_IROTH)? „r“:'-');
printf ((sfile.st_mode &S_IWOTH)? 'in':'-');
printf ((sfile.st_mode &S_IXOTH)? „x“:'-');
printf (' n');
}

IŠVADA:

Aukščiau pateiktame C kode mes įvedėme failo pavadinimą ir, jei failo nėra, programos vykdymas bus sustabdytas. Tai parodyta šiame paveikslėlyje:

Jei mūsų failas egzistuoja, bus iškviesta funkcija sfile (n), kurioje perduosime failo pavadinimą. Funkcijos viduje pirmiausia naudojome Stat sistemos iškvietimą, jei stat () grąžina -1, tada turi būti bet kokia klaida, todėl pranešimas bus atspausdintas ir programos vykdymas sustabdytas.

Tada „printf“ sakinyje naudojome funkcijos pavadinimą ir taškinį skyriklį, kad pasiektume duomenų narius stat struktura .

Tada failo režimui pasiekėme st_mode makrokomandas ar vėliavas. Čia loginiai ir operatoriai naudojami atitinkamiems režimams spausdinti. Patikrinome, ar nėra vartotojo, grupės ir kitų leidimų nurodytam failui (vartotojo įvestas failo pavadinimas).

Tokiu būdu galite pamatyti, kaip naudoti „C“ programavimo kalbos „stat“ sistemos skambutį, kad gautumėte informaciją iš OS branduolio apie failus. Jei turite klausimų, nedvejodami praneškite mums per komentarų skiltį.