A linux kernel által biztosított rendszerhívások a C programozási nyelven jelennek meg a glibc segítségével. Rendszerhívás használatakor kommunikál az operációs rendszerrel, és visszatérve az operációs rendszer a rendszerhívási funkciókhoz visszaadott paramétereken keresztül (visszatérési értékek) kommunikál Önnel.
Stat rendszerhívás:
A stat rendszerhívás egy rendszerhívás a Linuxban, hogy ellenőrizze a fájl állapotát, például annak ellenőrzését, hogy a fájl mikor volt elérhető. A stat () rendszerhívás valójában fájl attribútumokat ad vissza. Az inode fájl attribútumait alapvetően a Stat () függvény adja vissza. Az inode tartalmazza a fájl metaadatait. Az inode tartalmazza: a fájl típusát, a fájl méretét, amikor a fájlhoz hozzáfértek (módosították, törölték), azaz időbélyegeket, valamint a fájl elérési útját, a felhasználói azonosítót és a csoportazonosítót, a fájl hivatkozásait és a fájltartalom fizikai címe.
Azt mondhatjuk, hogy az inode tartalmazza a stat () rendszerhíváshoz szükséges összes adatot, és ez a fájl indexszáma, amelyet az inode táblázat tárol. Amikor létrehoz egy fájlt, egy inode szám jön létre a fájlhoz. A stat system call használatával a rendszer táblái megtekinthetők.
A C Stat rendszerhívás szintaxisa:
A stat rendszerhívás C programozási nyelven történő használatához a következő fejlécfájlt kell tartalmaznia:
#befoglalni
A stat a fájl állapotának lekérésére szolgál. A C stat rendszerhívás szintaxisa nem minden operációs rendszerben lehet azonos. Linux alatt a stat rendszerhívás szintaxisa a következő:
intállapot(const char *pálya, strukállapot*buf)
A függvény visszatérési típusa az int -ben, ha a függvényt sikeresen végrehajtottuk, 0 -t adunk vissza, ha bármilyen hiba van, -1 -et adunk vissza.
Itt const char *útvonal megadja a fájl nevét. Ha a fájl elérési útja szimbolikus hivatkozás, akkor a hivatkozást kell megadnia a fájlnév helyett.
Ezután a függvényben van egy statisztika, amelyben a fájlra vonatkozó adatok vagy információk tárolódnak, és egy elnevezett mutatót használnak buf, amelyet paraméterként adnak át, és a hívás végrehajtása során töltenek ki, és a felhasználó a hívás után olvasható.
Statisztika szerkezete:
A fejlécfájlban meghatározott stat struktúra a következő mezőket tartalmazza:
strukállapot{
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;
struktimspec st_atim;
struktimspec st_mtim;
struktimspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
};
Leírás:
- st_dev: Ez az eszköz azon azonosítója, amelyben a fájlunk jelenleg található.
- st_rdev: Ez a mező leírja, hogy egy adott fájl egy adott eszközt képvisel.
- st_ino: Ez a fájl bemeneti száma vagy sorozatszáma. Mivel ez egy indexszám, ezért minden fájlnak egyedinek kell lennie
- st_size: Az st_size a fájl mérete bájtban.
- st_atime: Ez az utolsó vagy legutóbbi időpont, amikor a fájlhoz hozzáfértek.
- st_ctime: Ez a legutóbbi időpont, amikor a fájl állapota vagy engedélyei megváltoztak.
- st_mtime: Ez a legutóbbi időpont, amikor a fájlt módosították.
- st_blksize: Ez a mező megadja az I/O fájlrendszer preferált blokkméretét, amely fájlonként eltérő lehet.
- st_blocks: Ez a mező a blokkok teljes számát adja meg 512 bájt többszörösében.
- st_nlink: Ez a mező a merev hivatkozások teljes számát mutatja.
- st_uid: Ez a mező jelzi a felhasználói azonosítót.
- st_gid: Ez a mező jelzi a csoport azonosítóját.
- st_mode: Ez jelzi a fájl engedélyeit, megmondja a fájl módját. A következő zászlókat kell megadni az st_mode mezőhöz:
Zászlók | Leírás | Zászló értéke |
---|---|---|
S_IFMT | A fájl módértékének lekérésére használt bitmaszk | 0170000 |
S_IFSOCK | Fájlállandó socket | 0140000 |
S_IFLINK | Szimbolikus link fájl konstans | 0120000 |
S_IFREG | Fájlállandó a normál fájlhoz | 0100000 |
S_IFBLK | Fájlállandó a blokkfájlhoz | 0060000 |
S_IFDIR | Fájlállandó a könyvtárfájlhoz | 0040000 |
S_IFCHR | Fájlállandó karakterfájl esetén | 0020000 |
S_IFIFO | Fájlállandó | 0010000 |
S_ISUID | Állítsa be a User ID bitet | 0004000 |
S_ISGID | Állítsa be a csoportazonosító bitet | 0002000 |
S_ISVTX | Ragadós bit, amely a megosztott szöveget jelzi | 0001000 |
S_IRWXU | Tulajdonos jogosultságok (olvasás, írás, végrehajtás) | 00700 |
S_IRUSR | Olvassa el a jogosultságokat a tulajdonos számára | 00400 |
S_IWUSR | Írjon jogosultságokat a tulajdonos számára | 00200 |
S_IXUSR | Végezze el a jogosultságokat a tulajdonos számára | 00100 |
S_IRWXG | Csoportos engedélyek (olvasás, írás, végrehajtás) | 00070 |
S_IRGRP | Olvassa el a csoport jogosultságait | 00040 |
S_IWGRP | Írja be a csoport jogosultságait | 00020 |
S_IXGRP | Végezze el a csoport jogosultságait | 00010 |
S_IRWXO | Engedélyek mások számára (olvasás, írás, végrehajtás) | 00007 |
S_IROTH | Olvassa el az engedélyeket mások számára | 00004 |
S_IWOTH | Írjon engedélyeket másoknak | 00002 |
S_IXOTH | Végezzen engedélyeket másoknak | 00001 |
A Stat rendszerhívás használata:
A következő példa bemutatja, hogyan kell használni a stat rendszerhívást C programozási nyelven Linux, Ubuntu esetén.
1. példa:
A következő kódban megtaláljuk a fájl módját:
KÓD:
#befoglalni#befoglalni
intfő-()
{
// mutató a stat szerkezetre
strukállapot sfile;
// stat rendszerhívás
állapot('stat.c', &sfile);
// st_mode elérése (a stat structure adattagja)
printf ('st_mode = %o',sfile.st_mode);
Visszatérés 0;
}
A program fordítása és futtatása az alábbiak szerint tér vissza:
Ebben a kódban átadtuk a fájl nevét a stat rendszerhívásban, majd a mutatót a stat struktúra felé, amely az sfile. A stat szerkezetre mutató mutató ezután az st_mode elérésére szolgál, amely a fájl módját a printf utasítás használatával jeleníti meg.
A fejlécfájlt használjuk, így használhatja a stat rendszerhívást. A fejlécfájl a szabványos bemeneti/kimeneti könyvtári fájl, így a printf vagy scanf fájlokat a C kódban használhatja.
2. példa:
A következő kódban információkat kapunk a fájlról a stat system call segítségével:
KÓD:
#befoglalni#befoglalni
#befoglalni
#befoglalni
üressfile(char constfájl név[]);
intfő-(){
ssize_t olvasni;
char*puffer= 0;
size_tbuf_size= 0;
printf ('Írja be az ellenőrizni kívánt fájl nevét: n');
olvas=getline(&puffer, &buf_size,stdin);
ha (olvas<=0 ){
printf ('a getline nem sikerült n');
kijárat (1);
}
ha (puffer[olvas-1] == ' n'){
puffer[olvas-1] = 0;
}
ints=nyisd ki(puffer,O_RDONLY);
ha(s== -1){
printf ('A fájl nem létezik n');
kijárat (1);
}
más{
sfile(puffer);
}
ingyenes (puffer);
Visszatérés 0;
}
üressfile(char constfájl név[]){
strukállapot sfile;
ha(állapot(fájl név, &sfile)== -1){
printf ('Hiba történt n');
}
// A statructure adattagjainak elérése
printf (' nSt_uid %d fájl n',sfile.st_uid);
printf (' nSt_blksize %ld fájl n',sfile.st_blksize);
printf (' nSt_gid fájl %d n',sfile.st_gid);
printf (' nSt_blocks %ld fájl n',sfile.st_blocks);
printf (' nSt_size %ld fájl n',sfile.st_size);
printf (' nSt_nlink% u fájl n',(aláírás nélküli int)sfile.st_nlink);
printf (' nFájljogosultságok felhasználó n');
printf ((sfile.st_mode &S_IRUSR)? 'r':'-');
printf ((sfile.st_mode &S_IWUSR)? 'ban ben':'-');
printf ((sfile.st_mode &S_IXUSR)? 'x':'-');
printf (' n');
printf (' nFájljogosultsági csoport n');
printf ((sfile.st_mode &S_IRGRP)? 'r':'-');
printf ((sfile.st_mode &S_IWGRP)? 'ban ben':'-');
printf ((sfile.st_mode &S_IXGRP)? 'x':'-');
printf (' n');
printf (' nFájljogosultságok Egyéb n');
printf ((sfile.st_mode &S_IROTH)? 'r':'-');
printf ((sfile.st_mode &S_IWOTH)? 'ban ben':'-');
printf ((sfile.st_mode &S_IXOTH)? 'x':'-');
printf (' n');
}
KIMENET:
A fenti C kódba beírtuk a fájl nevét, és ha a fájl nem létezik, akkor a program végrehajtása leáll. Ezt bizonyítja az alábbi kép:
Ha létezik fájlunk, akkor az sfile (n) függvényt hívjuk meg, amelyben átadtuk a fájl nevét. A függvényen belül először a Stat rendszerhívást használtuk, ha a stat () -1 értéket ad vissza, akkor minden hibának meg kell jelennie, így az üzenet kinyomtatásra kerül, és a program végrehajtása leáll.
Ezután a printf utasításban a függvény és a pontelválasztó nevét használtuk az adatok tagjainak eléréséhez stat structure .
Ezután a fájlmódhoz hozzáértünk az st_mode makróihoz vagy zászlóihoz. Itt a logikai és az operátor a megfelelő módok nyomtatására szolgál. Ellenőriztük a felhasználó, csoport és mások engedélyeit a megadott fájlhoz (a felhasználó által megadott fájlnév).
Ezzel láthatja, hogyan kell használni a C programozási nyelvből származó stat rendszerhívást, hogy információkat szerezzen az operációs rendszer kerneljéről a fájlokról. Ha kérdése van, bátran jelezze nekünk a megjegyzés rovatban.