Pozivi Linux sustava
Sistemski pozivi koje pruža jezgra linux izloženi su u programskom jeziku C putem glibc. Kada se koristi sistemski poziv, komunicirate s OS-om i po povratku OS komunicira s vama kroz parametre koji se vraćaju u funkcije sistemskog poziva (povratne vrijednosti).
Stat System Poziv:
Stat system call je sistemski poziv u Linuxu za provjeru statusa datoteke, poput provjere pristupa datoteci. Sistemski poziv stat () zapravo vraća atribute datoteke. Atributi datoteke inode u osnovi vraća funkcija Stat (). Inode sadrži metapodatke datoteke. Inode sadrži: vrstu datoteke, veličinu datoteke, kada je datoteci pristupljeno (izmijenjeno, izbrisano), odnosno vremenske oznake, te put datoteke, korisnički ID i ID grupe, veze datoteke i fizička adresa sadržaja datoteke.
Možemo reći da inode sadrži sve podatke potrebne za sistemski poziv stat () i to je indeksni broj datoteke koja se sprema u inode tablicu. Kad god kreirate datoteku, stvara se broj inode za tu datoteku. Korištenjem sistemskog poziva stat mogu se pregledavati tablice sustava.
Sintaksa sistemskog poziva C Stat:
Da biste koristili sistemski poziv stat u programskom jeziku C, morate uključiti sljedeću datoteku zaglavlja:
#includeStat se koristi za dobivanje statusa datoteke. Sintaksa sistemskog poziva C stat možda neće biti ista za svaki operativni sustav. U Linuxu je sintaksa za sistemski poziv stat sljedeća:
int stat (const char * staza, struct stat * buf)Tip povrata funkcije u int, ako se funkcija uspješno izvrši, vraća se 0 ako postoje greške, vratit će se -1.
Ovdje const char * put određuje naziv datoteke. Ako je put do datoteke simbolična veza, tada morate navesti vezu umjesto naziva datoteke.
Tada u funkciji imamo a stat struktura u kojem se pohranjuju podaci ili podaci o datoteci koji koriste pokazivač s imenom buf, koji se predaje kao parametar i popunjava tijekom izvršenja poziva, a korisnik ga može pročitati nakon poziva.
Stat struktura:
Stat struktura koja je definirana u
mod_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 uređaja u kojem trenutno imamo svoju 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. Kako je to indeksni broj, tako bi trebao biti jedinstven za sve datoteke
- st_size: st_size je veličina datoteke u bajtovima.
- st_atime: To je zadnji put ili nedavno vrijeme pristupanja datoteci.
- st_ctime: Nedavno je promijenjeno stanje ili dopuštenja datoteke.
- st_mtime: To je nedavno vrijeme u kojem je datoteka promijenjena.
- 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 ukupan broj blokova u višekratnicima od 512 bajtova.
- st_nlink: Ovo polje govori ukupan broj tvrdih veza.
- st_uid: Ovo polje označava korisnički ID.
- st_gid: Ovo polje označava ID grupe.
- st_mode: Označava dozvole za datoteku i govori o načinima rada na datoteci. Slijede zastave koje treba definirati za polje st_mode:
Zastave | Opis | Vrijednost zastave |
---|---|---|
S_IFMT | Bitmaska koja se koristi za dobivanje vrijednosti načina rada datoteke | 0170000 |
S_IFSOCK | Konstanta datoteke utičnice | 0140000 |
S_IFLINK | Konstanta datoteke simboličke veze | 0120000 |
S_IFREG | Konstanta datoteke za redovnu datoteku | 0100000 |
S_IFBLK | Datoteka konstanta za blok datoteku | 0060000 |
S_IFDIR | Datoteka konstanta za datoteku direktorija | 0040000 |
S_IFCHR | Datoteka konstanta za datoteku znakova | 0020000 |
S_IFIFO | Konstanta datoteke fifo | 0010000 |
S_ISUID | Postavite bit ID-a korisnika | 0004000 |
S_ISGID | Postavite bit ID-a grupe | 0002000 |
S_ISVTX | Ljepljivi bit koji označava zajednički tekst | 0001000 |
S_IRWXU | Vlasnička dopuštenja (čitanje, pisanje, izvršavanje) | 00700 |
S_IRUSR | Pročitajte dopuštenja za vlasnika | 00400 |
S_IWUSR | Napišite dozvole za vlasnika | 00200 |
S_IXUSR | Izvršiti dozvole za vlasnika | 00100 |
S_IRWXG | Grupna dopuštenja (čitanje, pisanje, izvršavanje) | 00070 |
S_IRGRP | Pročitajte dopuštenja za grupu | 00040 |
S_IWGRP | Napišite dopuštenja za grupu | 00020 |
S_IXGRP | Izvršiti dopuštenja za grupu | 00010 |
S_IRWXO | Dopuštenja za druge (čitanje, pisanje, izvršavanje) | 00007 |
S_IROTH | Pročitajte dopuštenja za druge | 00004 |
S_IWOTH | Napišite dopuštenja za druge | 00002 |
S_IXOTH | Izvršite dopuštenja za druge | 00001 |
Kako se koristi sistemski poziv Stat:
Sljedeći primjer pokazuje kako koristiti stat sistemski poziv u programskom jeziku C u Linuxu, Ubuntuu.
PRIMJER 1:
U sljedećem ćemo kodu pronaći način datoteke:
KODIRATI:
#include#include
int main ()
// pokazivač na stat struct
struct stat sfile;
// stat sistemski poziv
stat ("stat.c ", & sfile);
// pristup st_mode (član podataka stat struct)
printf ("st_mode =% o", sfile.st_mode);
return 0;
Sastavljanje i izvođenje programa vraća se kao u nastavku:
U ovom kodu proslijedili smo ime datoteke u sistemskom pozivu stat, a zatim pokazivač na stat struct koji je sfile. Pokazivač na stat struct se zatim koristi za pristup st_mode koji prikazuje način rada datoteke pomoću ispisa printf.
Datoteka zaglavlja
PRIMJER 2:
U sljedećem kodu dobit ćemo informacije o datoteci pomoću sistemskog poziva stat:
KODIRATI:
#include#include
#include
#include
void sfile (naziv datoteke char const []);
int main ()
ssize_t pročitati;
char * međuspremnik = 0;
size_t buf_size = 0;
printf ("Unesite ime datoteke za provjeru: \ n");
read = getline (& buffer, & buf_size, stdin);
ako (čitaj <=0 )
printf ("getline nije uspio \ n");
izlaz (1);
if (međuspremnik [read-1] == '\ n')
međuspremnik [čitanje-1] = 0;
int s = otvoren (međuspremnik, O_RDONLY);
ako (s == - 1)
printf ("Datoteka ne postoji \ n");
izlaz (1);
drugo
sfile (međuspremnik);
besplatno (tampon);
return 0;
void sfile (char const naziv datoteke [])
struct stat sfile;
if (stat (naziv datoteke, & sfile) == - 1)
printf ("Dogodila se pogreška \ 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 ("\ nDatoteka st_nlink% u \ n", (nepotpisani int) sfile.st_nlink);
printf ("\ nKorisnik dozvola datoteke \ 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 ("\ nDopuštenja 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");
IZLAZ:
U gornji C kod unijeli smo ime datoteke i ako datoteka ne postoji, izvršenje programa će biti zaustavljeno. To je prikazano na sljedećoj slici:
Ako naša datoteka postoji, pozvat će se funkcija sfile (n) u koju smo proslijedili ime datoteke. Unutar funkcije, prije svega koristili smo sistemski poziv Stat, ako stat () vrati -1, onda mora postojati bilo kakva pogreška pa će se ispisati poruka i zaustaviti izvršavanje programa.
Tada smo u izjavi printf koristili ime funkcije i odvajač točaka za pristup članovima podataka stat struct.
Tada smo za način datoteke pristupili makronaredbama ili zastavicama st_mode. Ovdje se za ispis odgovarajućih načina koristi logički i operator. Provjerili smo ima li dozvola za korisnika, grupu i ostale za navedenu datoteku (naziv datoteke unosi korisnik).
Ovim možete vidjeti kako koristiti sistemski poziv stat iz programskog jezika C za dobivanje informacija iz jezgre OS-a o datotekama. Ako imate pitanje, slobodno nam recite putem odjeljka za komentare.