Sistemski pozivi koje pruža jezgra linux izloženi su u programskom jeziku C putem glibc. Kad se koristi sistemski poziv, komunicirate s OS -om, a pri povratku OS vam komunicira putem parametara koji se vraćaju funkcijama sistemskog poziva (povratne vrijednosti).
Poziv Stat sustava:
Stat sistemski poziv je sistemski poziv u sustavu Linux radi provjere statusa datoteke, primjerice provjere pristupa datoteci. Sistemski poziv stat () zapravo vraća atribute datoteke. Atributi datoteke inode u osnovi se vraćaju funkcijom Stat (). Inode sadrži metapodatke datoteke. Inode sadrži: vrstu datoteke, veličinu datoteke, kada je datoteci pristupilo (izmijenjeno, izbrisano), to jest vremenske oznake, te put datoteke, korisnički ID i ID grupe, veze do datoteke i fizičku adresu sadržaja datoteke.
Možemo reći da inode sadrži sve podatke koji su potrebni za sistemski poziv stat () i da je to indeksni broj datoteke koja se sprema u inode tablicu. Kad god stvorite datoteku, stvara se inode broj za tu datoteku. Pomoću stat poziva sustava mogu se pregledati tablice sustava.
Sintaksa poziva sustava C Stat:
Da biste koristili sistemski poziv stat u programskom jeziku C, morate uključiti sljedeću datoteku zaglavlja:
#uključi
Stat se koristi za dobivanje statusa datoteke. Sintaksa poziva C stat sustava možda nije ista za svaki operacijski sustav. U Linuxu je sintaksa za sistemski poziv stat sljedeća:
intdržava(konst char *staza, structdržava*buf)
Vrsta funkcije u int, ako je funkcija uspješno izvedena, 0 se vraća ako ima grešaka, -1 će biti vraćeno.
Ovdje const char *put navodi naziv datoteke. Ako je put datoteke simbolična veza, morate umjesto naziva datoteke navesti vezu.
Zatim u funkciji imamo statičku strukturu u koju se pohranjuju podaci ili informacije o datoteci koja koristi pokazivač po imenu buf, koji se prosljeđuje kao parametar i popunjava tijekom izvršavanja poziva i čita ga korisnik nakon poziva.
Statistička struktura:
Struktura stat koja je definirana u datoteci zaglavlja sadrži sljedeća polja:
structdržava{
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;
};
Opis:
- st_dev: To je ID uređaja u kojem trenutno imamo datoteku.
- st_rdev: Ovo polje opisuje da određena datoteka predstavlja određeni uređaj.
- st_ino: To je broj inode ili serijski broj datoteke. Budući da je to indeksni broj, trebao bi biti jedinstven za sve datoteke
- st_size: st_size je veličina datoteke u bajtima.
- st_atime: To je posljednji put ili nedavno vrijeme pristupa datoteci.
- st_ctime: Nedavno je vrijeme u kojem je promijenjen status ili dopuštenja datoteke.
- st_mtime: Nedavno je vrijeme izmjene datoteke.
- st_blksize: Ovo polje daje željenu veličinu bloka za I/O datotečni sustav koja se može razlikovati od datoteke do datoteke.
- st_blocks: Ovo polje govori o ukupnom broju blokova višestruko od 512 bajtova.
- st_nlink: Ovo polje govori o ukupnom broju tvrdih veza.
- st_uid: Ovo polje označava korisnički ID.
- st_gid: Ovo polje označava ID grupe.
- st_mode: Pokazuje dopuštenja za datoteku, govori o načinima na datoteci. Slijede zastavice koje treba definirati za polje st_mode:
Zastave | Opis | Vrijednost zastavice |
---|---|---|
S_IFMT | Bitmaska koja se koristi za dobivanje vrijednosti moda datoteke | 0170000 |
S_IFSOCK | Datoteka konstanta utičnice | 0140000 |
S_IFLINK | Konstanta datoteke simboličke veze | 0120000 |
S_IFREG | Datoteka konstanta za običnu datoteku | 0100000 |
S_IFBLK | Datoteka konstanta za datoteku bloka | 0060000 |
S_IFDIR | Datoteka konstanta za datoteku direktorija | 0040000 |
S_IFCHR | Datoteka konstanta za datoteku znakova | 0020000 |
S_IFIFO | Fifo konstanta datoteke | 0010000 |
S_ISUID | Postavite bit User ID -a | 0004000 |
S_ISGID | Postavite bit ID grupe | 0002000 |
S_ISVTX | Ljepljivi bit koji označava zajednički tekst | 0001000 |
S_IRWXU | Dopuštenja vlasnika (čitanje, pisanje, izvršavanje) | 00700 |
S_IRUSR | Dopuštenja za čitanje vlasnika | 00400 |
S_IWUSR | Dopuštenja za pisanje za vlasnika | 00200 |
S_IXUSR | Izvršite dopuštenja za vlasnika | 00100 |
S_IRWXG | Grupna dopuštenja (čitanje, pisanje, izvršavanje) | 00070 |
S_IRGRP | Dopuštenja za čitanje za grupu | 00040 |
S_IWGRP | Dopuštenja za pisanje za grupu | 00020 |
S_IXGRP | Izvršite dopuštenja za grupu | 00010 |
S_IRWXO | Dopuštenja za druge (čitanje, pisanje, izvršavanje) | 00007 |
S_IROTH | Dopuštenja za čitanje za druge | 00004 |
S_IWOTH | Dopuštenja za pisanje za druge | 00002 |
S_IXOTH | Izvršite dopuštenja za druge | 00001 |
Kako koristiti sistemski poziv Stat:
Sljedeći primjer pokazuje kako se koristi sistemski poziv stat u programskom jeziku C u Linuxu, Ubuntu.
PRIMJER 1:
U sljedećem kodu pronaći ćemo način rada datoteke:
KODIRATI:
#uključi#uključi
intglavni()
{
// pokazivač na stat struct
structdržavni sfile;
// stat sistemski poziv
država('stat.c', &sfile);
// pristupanje st_mode (član podataka stat struct)
printf ('st_mode = %o',sfile.st_mode);
povratak 0;
}
Sastavljanje i pokretanje programa vraća se na sljedeći način:
U ovom smo kodu proslijedili naziv datoteke u sistemskom pozivu stat, a zatim pokazivač na stat strukturu koja je sfile. Pokazivač na stat struct tada se koristi za pristup st_mode koji prikazuje način rada datoteke pomoću ispisa printf.
Zaglavlje se koristi tako da možete koristiti stat sistemski poziv. Zaglavna datoteka je standardna datoteka ulazno/izlazne knjižnice tako da možete koristiti printf ili scanf u svom C kodu.
PRIMJER 2:
U sljedećem kodu ćemo dobiti informacije o datoteci pomoću sistemskog poziva stat:
KODIRATI:
#uključi#uključi
#uključi
#uključi
poništitisfile(char konstnaziv datoteke[]);
intglavni(){
ssize_t čitanje;
char*pufer= 0;
veličina_tbuf_size= 0;
printf ('Unesite naziv datoteke za provjeru: n');
čitati=getline(&pufer, &buf_size,stdin);
ako (čitati<=0 ){
printf ('getline nije uspio n');
Izlaz (1);
}
ako (pufer[čitati-1] == ' n'){
pufer[čitati-1] = 0;
}
ints=otvorena(pufer,O_RDONLY);
ako(s== -1){
printf ('Datoteka ne postoji n');
Izlaz (1);
}
drugo{
sfile(pufer);
}
besplatno (pufer);
povratak 0;
}
poništitisfile(char konstnaziv datoteke[]){
structdržavni sfile;
ako(država(naziv datoteke, &sfile)== -1){
printf ('Došlo je do pogreške n');
}
// Pristup članovima podataka 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 (' nFile st_nlink %u n',(nepotpisan int)sfile.st_nlink);
printf (' nKorisnik Dozvole za datoteke n');
printf ((sfile.st_mode &S_IRUSR)? 'r':'-');
printf ((sfile.st_mode &S_IWUSR)? 'u':'-');
printf ((sfile.st_mode &S_IXUSR)? 'x':'-');
printf (' n');
printf (' nGrupa za dopuštenja datoteka n');
printf ((sfile.st_mode &S_IRGRP)? 'r':'-');
printf ((sfile.st_mode &S_IWGRP)? 'u':'-');
printf ((sfile.st_mode &S_IXGRP)? 'x':'-');
printf (' n');
printf (' nDopuštenja za datoteke Ostalo n');
printf ((sfile.st_mode &S_IROTH)? 'r':'-');
printf ((sfile.st_mode &S_IWOTH)? 'u':'-');
printf ((sfile.st_mode &S_IXOTH)? 'x':'-');
printf (' n');
}
IZLAZ:
U gornji C kod unijeli smo naziv datoteke i ako datoteka ne postoji tada će se izvršenje programa zaustaviti. To je prikazano na sljedećoj slici:
Ako naša datoteka postoji, pozvat će se funkcija sfile (n) u kojoj smo proslijedili naziv datoteke. Unutar funkcije, prije svega, koristili smo sistemski poziv Stat, ako stat () vrati -1 onda mora postojati bilo koja greška pa će se ispisati poruka i zaustaviti izvođenje programa.
Zatim smo u ispisu printf koristili naziv funkcije i separator točaka za pristup članovima podataka stat struct .
Zatim smo za način datoteke pristupili makroima ili zastavama st_mode. Ovdje se logika i operator koriste za ispis odgovarajućih načina. Provjerili smo dozvole za korisnike, grupe i druge za navedenu datoteku (naziv datoteke unijeo je korisnik).
Pomoću ovoga možete vidjeti kako koristiti sistemski poziv stat iz programskog jezika C za dobivanje informacija iz kernela OS -a o datotekama. Ako imate pitanje, slobodno nam recite putem odjeljka komentara.