Vodič za pozivanje sustava Stat za Linux

Stat System Call Linux Tutorial



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:

  1. st_dev: To je ID uređaja u kojem trenutno imamo datoteku.
  2. st_rdev: Ovo polje opisuje da određena datoteka predstavlja određeni uređaj.
  3. st_ino: To je broj inode ili serijski broj datoteke. Budući da je to indeksni broj, trebao bi biti jedinstven za sve datoteke
  4. st_size: st_size je veličina datoteke u bajtima.
  5. st_atime: To je posljednji put ili nedavno vrijeme pristupa datoteci.
  6. st_ctime: Nedavno je vrijeme u kojem je promijenjen status ili dopuštenja datoteke.
  7. st_mtime: Nedavno je vrijeme izmjene datoteke.
  8. st_blksize: Ovo polje daje željenu veličinu bloka za I/O datotečni sustav koja se može razlikovati od datoteke do datoteke.
  9. st_blocks: Ovo polje govori o ukupnom broju blokova višestruko od 512 bajtova.
  10. st_nlink: Ovo polje govori o ukupnom broju tvrdih veza.
  11. st_uid: Ovo polje označava korisnički ID.
  12. st_gid: Ovo polje označava ID grupe.
  13. 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.