„Linux“ sistemos skambučiai
Sistemos skambučiai, kuriuos teikia „Linux“ branduolys, yra matomi C programavimo kalba per glibc. Kai naudojamas sistemos skambutis, jūs bendraujate su OS, o grįžę OS jums praneša per parametrus, kurie grąžinami į sistemos skambučio funkcijas (grąžinimo reikšmės).
„Stat“ sistemos iškvietimas:
„Stat“ sistemos iškvietimas yra „Linux“ sistemos skambutis, skirtas patikrinti failo būseną, pavyzdžiui, patikrinti, kada buvo pasiektas failas. Stat () sistemos iškvietimas iš tikrųjų grąžina failo atributus. Inodo failo atributus iš esmės grąžina funkcija Stat (). Inode yra failo metaduomenys. Inode yra: failo tipas, failo dydis, kai buvo pasiektas failas (modifikuotas, ištrintas), tai yra laiko žymos, ir failo kelias, vartotojo ID ir grupės ID, failo nuorodos ir failo turinio fizinis adresas.
Galime sakyti, kad „inode“ yra visi duomenys, reikalingi „stat ()“ sistemos iškvietimui, ir tai yra failo indekso numeris, kuris yra išsaugotas „inode“ lentelėje. Kai kuriate failą, sukuriamas to failo inodo numeris. Naudojant stat sistemos iškvietimą, galima peržiūrėti sistemos lenteles.
C Stat sistemos iškvietimo sintaksė:
Norėdami naudoti „Stat“ sistemos iškvietimą C programavimo kalba, turite įtraukti šį antraštės failą:
# įtrauktiStat naudojamas norint gauti failo būseną. „C stat“ sistemos skambučio sintaksė gali būti nevienoda kiekvienoje operacinėje sistemoje. „Linux“ sisteminės statistikos iškvietimo sintaksė yra tokia:
int stat (const char * kelias, struct stat * buf)Funkcijos grąžinimo tipas tarpt, jei funkcija vykdoma sėkmingai, grąžinama 0, jei yra klaidų, grąžinama -1.
Čia const char * kelias nurodo failo pavadinimą. Jei failo kelias yra simbolinė nuoroda, vietoj failo pavadinimo turite nurodyti nuorodą.
Tada funkcijoje turime a stat struktūra kuriame saugomi duomenys ar informacija apie failą, kuriame naudojamas rodyklė buf, kuris perduodamas kaip parameteris ir užpildomas skambučio metu ir kurį vartotojas gali perskaityti po skambučio.
Stat struktūra:
Stat struktūra, apibrėžta
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_t st_size;
struct timspec st_atim;
struct timspec st_mtim;
struct timspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
;
Apibūdinimas:
- st_dev: Šiuo metu yra įrenginio, kuriame turime failą, ID.
- st_rdev: Šiame lauke aprašoma, kad konkretus failas reiškia konkretų įrenginį.
- st_ino: Tai failo inodo numeris arba serijos numeris. Kadangi tai yra indekso numeris, jis turėtų būti unikalus visiems failams
- st_size: st_size yra failo dydis baitais.
- st_atime: Tai paskutinis ar paskutinis laikas, kai buvo pasiekta byla.
- st_ctime: Tai paskutinis laikas, kai buvo pakeista failo būsena arba leidimai.
- st_mtime: Tai paskutinis failo modifikavimo laikas.
- st_blksize: Šiame lauke nurodomas pageidaujamas įvesties / išvesties failų sistemos bloko dydis, kuris kiekviename faile gali skirtis.
- st_blocks: Šis laukas nurodo bendrą blokų skaičių 512 baitų kartotiniais.
- st_nlink: Šis laukas nurodo bendrą standžiųjų nuorodų skaičių.
- st_uid: Šis laukas nurodo vartotojo ID.
- st_gid: Šis laukas nurodo grupės ID.
- st_mode: Tai nurodo failo teises, nurodo failo režimus. Toliau pateikiamos žymos, kurios turėtų būti apibrėžtos lauke st_mode:
Vėliavos | apibūdinimas | Vėliavos vertė |
---|---|---|
S_IFMT | Bitmaskas naudojamas 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 | Bloko failo failo konstanta | 0060000 |
S_IFDIR | Katalogo failo konstanta | 0040000 |
S_IFCHR | Failo konstanta simbolių failui | 0020000 |
S_IFIFO | Failo konstanta yra fifo | 0010000 |
S_ISUID | Nustatykite „User ID“ bitą | 0004000 |
S_ISGID | Nustatykite grupės ID bitą | 0002000 |
S_ISVTX | Lipnus antgalis, nurodantis bendrą tekstą | 0001000 |
S_IRWXU | Savininko leidimai (skaityti, rašyti, vykdyti) | 00700 |
S_IRUSR | Skaityti leidimus savininkui | 00400 |
S_IWUSR | Rašymo leidimai savininkui | 00200 |
S_IXUSR | Vykdyti savininko leidimus | 00100 |
S_IRWXG | Grupės leidimai (skaityti, rašyti, vykdyti) | 00070 |
S_IRGRP | Grupės skaitymo leidimai | 00040 |
S_IWGRP | Rašymo leidimai 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šymo leidimai kitiems | 00002 |
S_IXOTH | Vykdyti leidimus kitiems | 00001 |
Kaip naudotis „Stat“ sistemos iškvietimu:
Šis pavyzdys rodo, kaip naudoti „Stat“ sistemos skambutį C programavimo kalba „Linux“, „Ubuntu“.
1 PAVYZDYS:
Šiame kode rasime failo režimą:
KODAS:
# įtraukti# įtraukti
int main ()
// rodyklė į stat struct
struct stat sfile;
// stat sistemos iškvietimas
stat ("stat.c ", & sfile);
// prieiga prie st_mode (statistinės struktūros duomenų narys)
printf ("st_mode =% o", sfile.st_mode);
grąžinti 0;
Kompiliuojant ir vykdant programą grąžinama taip:
Šiame kode mes perdavėme failo pavadinimą į „Stat“ sistemos iškvietimą ir tada rodyklę į „stat struct“, kuri yra sfile. Tada žymeklis į stat struct naudojamas norint pasiekti st_mode, kuris rodo failo režimą naudodamas „printf“ pareiškimą.
Antraštės failas
2 PAVYZDYS:
Šiame kode gausime informaciją apie failą naudodami stat sistemos iškvietimą:
KODAS:
# įtraukti# įtraukti
# įtraukti
# įtraukti
void sfile (char const failo pavadinimas []);
int main ()
ssize_t skaityti;
char * buferis = 0;
dydis_t buf_size = 0;
printf ("Įveskite failo pavadinimą, kurį norite patikrinti: \ n");
read = getline (& buferis, & buf_size, stdin);
jei (skaityti <=0 )
printf ("getline nepavyko \ n");
išėjimas (1);
jei (buferis [skaityti-1] == '\ n')
buferis [skaityti-1] = 0;
int s = atviras (buferis, O_RDONLY);
jei (s == - 1)
printf ("Failo nėra \ n");
išėjimas (1);
Kitas
sfile (buferis);
laisvas (buferis);
grąžinti 0;
negaliojantis sfile (char const failo pavadinimas [])
struct stat sfile;
jei (stat (failo pavadinimas, & sfile) == - 1)
printf ("Įvyko klaida \ n");
// Prieiga prie statistikos struktūros duomenų narių
printf ("\ nFile st_uid% d \ n", sfile.st_uid);
printf ("\ nFile st_blksize% ld \ n", sfile.st_blksize);
printf ("\ nFile st_gid% d \ n", sfile.st_gid);
printf ("\ nFile st_blocks% ld \ n", sfile.blokai);
printf ("\ nFile st_size% ld \ n", sfile.st_size);
printf ("\ nFile st_nlink% u \ n", (nepasirašytas int) sfile.st_nlink);
printf ("\ nFailo leidimų vartotojas \ 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 ("\ nFailo teisių grupė \ 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 ("\ nKito failo leidimai \ n");
printf ((sfile.st_mode & S_IROTH)? „r“: „-“);
printf ((sfile.st_mode & S_IWOTH)? „w“: „-“);
printf ((sfile.st_mode & S_IXOTH)? „x“: „-“);
printf ("\ n");
IŠĖJIMAS:
Pirmiau 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 mes perdavėme failo pavadinimą. Funkcijos viduje visų pirma mes naudojome „Stat“ sistemos iškvietimą, jei stat () grąžina -1, tada turi būti bet kokia klaida, todėl bus išspausdintas pranešimas ir sustabdytas programos vykdymas.
Tada „printf“ sakinyje mes naudojome funkcijos pavadinimą ir taškų skyriklį, kad galėtume pasiekti duomenų narius stat strukt.
Tada failo režimui mes pasiekėme st_mode makrokomandas arba vėliavas. Čia loginiai ir operatoriai naudojami spausdinti atitinkamus režimus. Patikrinome, ar nėra vartotojo, grupės ir kitų nurodyto failo (vartotojo įvesto failo pavadinimo) leidimų.
Tai galite pamatyti, kaip naudotis stat sistemos iškvietimu iš C programavimo kalbos, norint gauti informacijos iš OS branduolio apie failus. Jei turite klausimų, praneškite mums per komentarų skyrių.