Stat System Call Linux -opetusohjelma

Stat System Call Linux Tutorial



Linux -ytimen tarjoamat järjestelmäkutsut paljastetaan C -ohjelmointikielellä glibc: n kautta. Kun järjestelmäpuhelua käytetään, olet yhteydessä käyttöjärjestelmään ja palataessa käyttöjärjestelmä kommunikoi sinulle parametrien kautta, jotka palautetaan järjestelmäkutsutoimintoihin (paluuarvot).

Stat System -puhelu:

Stat -järjestelmäpuhelu on järjestelmäpuhelu Linuxissa, jolla tarkistetaan tiedoston tila ja esimerkiksi tarkistetaan, milloin tiedostoa on käytetty. Järjestelmäkutsu stat () palauttaa itse tiedostomääritteet. Inode -tiedoston määritteet palautetaan periaatteessa Stat () -funktiolla. Inode sisältää tiedoston metatiedot. Inode sisältää: tiedoston tyypin, tiedoston koon, kun tiedostoa käytettiin (muutettiin, poistettiin) eli aikaleimoja, ja tiedoston polun, käyttäjätunnuksen ja ryhmän tunnuksen, tiedoston linkit ja tiedoston sisällön fyysinen osoite.







Voimme sanoa, että inode sisältää kaikki stat () -järjestelmäkutsuun tarvittavat tiedot ja se on tiedoston indeksinumero, joka tallennetaan inode -taulukkoon. Aina kun luot tiedoston, sille luodaan inode -numero. Käyttämällä stat system call -järjestelmää voit tarkastella järjestelmän taulukoita.



C Stat -järjestelmäkutsun syntaksi:

Jotta voit käyttää stat -järjestelmän kutsua C -ohjelmointikielellä, sinun on sisällytettävä seuraava otsikkotiedosto:



#sisältää

Statia käytetään tiedoston tilan selvittämiseen. C stat -järjestelmäkutsun syntaksi ei välttämättä ole sama kaikissa käyttöjärjestelmissä. Linuxissa stat -järjestelmän kutsun syntaksi on seuraava:





intosavaltio(const hiiltyä *polku, rakenneosavaltio*buf)

Funktion palautustyyppi int: ssä, jos funktio suoritetaan onnistuneesti, palautetaan 0, jos virheitä ilmenee, -1 palautetaan.

Tässä const char *polku määrittää tiedoston nimen. Jos tiedoston polku on symbolinen linkki, sinun on määritettävä linkki tiedoston nimen sijaan.



Sitten funktiossa meillä on tilarakenne, johon tallennetaan tiedoston tiedot, jotka käyttävät nimettyä osoitinta buf, joka syötetään parametrinä ja täytetään puhelun suorittamisen aikana ja käyttäjä voi lukea sen puhelun jälkeen.

Tilastollinen rakenne:

Otsikkotiedostossa määritetty tilarakenne sisältää seuraavat kentät:

rakenneosavaltio
{
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;
rakennetimspec st_atim;
rakennetimspec st_mtim;
rakennetimspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
};

Kuvaus:

  1. st_dev: Se on sen laitteen tunnus, jossa tiedosto on tällä hetkellä.
  2. st_rdev: Tämä kenttä kuvaa, että tietty tiedosto edustaa tiettyä laitetta.
  3. st_ino: Se on tiedoston inode- tai sarjanumero. Koska se on indeksinumero, sen pitäisi olla yksilöllinen kaikille tiedostoille
  4. st_size: st_size on tiedoston koko tavuina.
  5. st_atime: Se on viimeinen tai viimeinen aika, jolloin tiedostoa käytettiin.
  6. st_ctime: Se on viimeinen aika, jolloin tiedoston tilaa tai käyttöoikeuksia muutettiin.
  7. st_mtime: Tiedostoa on viime aikoina muokattu.
  8. st_blksize: Tämä kenttä antaa I/O -tiedostojärjestelmän ensisijaisen lohkon koon, joka voi vaihdella tiedostosta toiseen.
  9. st_blocks: Tämä kenttä kertoo lohkojen kokonaismäärän 512 tavun kerrannaisina.
  10. st_nlink: Tämä kenttä kertoo kovien linkkien kokonaismäärän.
  11. st_uid: Tämä kenttä osoittaa käyttäjätunnuksen.
  12. st_gid: Tämä kenttä osoittaa ryhmän tunnuksen.
  13. st_mode: Se ilmaisee tiedoston käyttöoikeudet ja kertoo tiedoston tilat. Seuraavat ovat st_mode -kentän määritettävät liput:
Liput Kuvaus Lipun arvo
S_IFMT Bittimaski, jota käytetään tiedoston tilan arvon saamiseen 0170000
S_IFSOCK Pistorasian tiedostovakio 0140000
S_IFLINK Symbolisen linkin tiedostovakio 0120000
S_IFREG Tiedoston vakio tavalliselle tiedostolle 0100000
S_IFBLK Tiedostovakio lohkotiedostolle 0060000
S_IFDIR Tiedostovakio hakemistotiedostolle 0040000
S_IFCHR Tiedostovakio merkkitiedostolle 0020000
S_IFIFO Tiedostovakio fifo 0010000
S_ISUID Aseta User ID -bitti 0004000
S_ISGID Aseta ryhmätunnusbitti 0002000
S_ISVTX Tahmea bitti, joka osoittaa jaetun tekstin 0001000
S_IRWXU Omistajan oikeudet (lukea, kirjoittaa, suorittaa) 00700
S_IRUSR Lue Käyttöoikeudet omistajalle 00400
S_IWUSR Kirjoita oikeudet omistajalle 00200
S_IXUSR Suorita omistajan käyttöoikeudet 00100
S_IRWXG Ryhmän käyttöoikeudet (luku, kirjoitus, suoritus) 00070
S_IRGRP Lue ryhmän käyttöoikeudet 00040
S_IWGRP Kirjoita oikeudet ryhmälle 00020
S_IXGRP Suorita ryhmän käyttöoikeudet 00010
S_IRWXO Käyttöoikeudet muille (lukea, kirjoittaa, suorittaa) 00007
S_IROTH Lue Käyttöoikeudet muille 00004
S_IWOTH Kirjoita luvat muille 00002
S_IXOTH Suorita luvat muille 00001

Kuinka käyttää Stat -järjestelmäpuhelua:

Seuraava esimerkki näyttää, kuinka stat -järjestelmäpuhelua käytetään C -ohjelmointikielellä Linuxissa, Ubuntussa.

ESIMERKKI 1:

Seuraavasta koodista löydämme tiedoston tilan:

KOODI:

#sisältää
#sisältää
inttärkein()
{
// osoitin stat -rakenteeseen
rakennetilatiedosto;

// stat -järjestelmän puhelu
osavaltio('stat.c', &sfile);

// pääsy st_mode -tilaan (stat structure -datajäsen)
printf ('st_mode = %o',sfile.st_mode);
palata 0;
}

Ohjelman kääntäminen ja suorittaminen palaa seuraavasti:

Tässä koodissa olemme välittäneet tiedoston nimen stat -järjestelmäkutsussa ja sitten osoittimen stat struktiin, joka on sfile. Osoitin stat struktuuri käytetään sitten päästä st_mode joka näyttää tiedoston tilan käyttämällä printf lausetta.

Otsikkotiedostoa käytetään, joten voit käyttää stat -järjestelmän puhelua. Otsikkotiedosto on vakiotulo-/tulostuskirjasto, jotta voit käyttää printf- tai scanf -tiedostoja C -koodissasi.

ESIMERKKI 2:

Seuraavassa koodissa saamme tietoja tiedostosta käyttämällä stat system -puhelua:

KOODI:

#sisältää
#sisältää
#sisältää
#sisältää

mitätönsfile(hiiltyä constTiedoston nimi[]);

inttärkein(){
ssize_t lukenut;
hiiltyä*puskuri= 0;
koko_tbuf_size= 0;

printf ('Kirjoita tarkistettavan tiedoston nimi: n'');
lukea=getline(&puskuri, &buf_size,stdin);

jos (lukea<=0 ){
printf (getline epäonnistui n'');
poistua (1);
}

jos (puskuri[lukea-1] == '' n''){
puskuri[lukea-1] = 0;
}

ints=avata(puskuri,O_RDONLY);
jos(s== -1){
printf ('Tiedostoa ei ole olemassa n'');
poistua (1);
}
muu{
sfile(puskuri);
}
vapaa (puskuri);
palata 0;
}

mitätönsfile(hiiltyä constTiedoston nimi[]){

rakennetilatiedosto;

jos(osavaltio(Tiedoston nimi, &sfile)== -1){
printf ('Tapahtui virhe n'');
}

// Pääsy tietorakenteen tietojäseniin
printf ('' nTiedosto st_uid %d n'',sfile.st_uid);
printf ('' nTiedosto st_blksize %ld n'',sfile.st_blksize);
printf ('' nTiedosto st_gid %d n'',sfile.st_gid);
printf ('' nTiedosto st_blocks %ld n'',sfile.st_blocks);
printf ('' nTiedosto st_size %ld n'',sfile.st_size);
printf ('' nTiedosto st_nlink% u n'',(allekirjoittamaton int)sfile.st_nlink);
printf ('' nTiedostojen käyttöoikeudet Käyttäjä n'');
printf ((sfile.st_mode &S_IRUSR)? 'r':'-');
printf ((sfile.st_mode &S_IWUSR)? 'sisään':'-');
printf ((sfile.st_mode &S_IXUSR)? 'x':'-');
printf ('' n'');
printf ('' nTiedostojen käyttöoikeusryhmä n'');
printf ((sfile.st_mode &S_IRGRP)? 'r':'-');
printf ((sfile.st_mode &S_IWGRP)? 'sisään':'-');
printf ((sfile.st_mode &S_IXGRP)? 'x':'-');
printf ('' n'');
printf ('' nTiedoston käyttöoikeudet Muut n'');
printf ((sfile.st_mode &S_IROTH)? 'r':'-');
printf ((sfile.st_mode &S_IWOTH)? 'sisään':'-');
printf ((sfile.st_mode &S_IXOTH)? 'x':'-');
printf ('' n'');
}

LÄHTÖ:

Yllä olevassa C -koodissa olemme kirjoittaneet tiedoston nimen ja jos tiedostoa ei ole olemassa, ohjelman suoritus pysäytetään. Tämä näkyy seuraavassa kuvassa:

Jos tiedostomme on olemassa, kutsutaan funktiota sfile (n), jossa olemme siirtäneet tiedoston nimen. Funktion sisällä on ensin käytetty Stat -järjestelmäkutsua, jos stat () palauttaa -1, virheen on oltava niin, että viesti tulostetaan ja ohjelman suoritus pysäytetään.

Sitten printf -lausekkeessa olemme käyttäneet funktion nimeä ja piste -erotinta pääsemään tietoihin stat struktuuri .

Sitten tiedostomuodolle olemme käyttäneet st_mode -makroja tai -lippuja. Tässä käytetään loogista ja operaattoria vastaavien tilojen tulostamiseen. Olemme tarkistaneet käyttäjän, ryhmän ja muiden oikeudet määritetylle tiedostolle (käyttäjän antama tiedostonimi).

Tämän avulla voit nähdä, kuinka voit käyttää C -ohjelmointikielen tilasysteemipuhelua saadaksesi tietoja OS -ytimestä tiedostoista. Jos sinulla on kysyttävää, kerro siitä meille kommenttiosion kautta.