Linux rendszerhívások
A linux kernel által nyújtott rendszerhívásokat a C programozási nyelv tárolja a glibc segítségével. Rendszerhívás használatakor Ön kommunikál az operációs rendszerrel, és visszatéréskor az operációs rendszer kommunikál veled a rendszerhívás funkciókhoz visszatérő paramétereken keresztül (visszatérési értékek).
Stat System hívás:
A Stat rendszerhívás a Linux rendszerhívása egy fájl állapotának ellenőrzésére, például a fájl elérésének időpontjára vonatkozóan. A stat () rendszerhívás valójában a fájlattribútumokat adja vissza. Az inode fájlattribú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ájlt elérte (módosította, törölte), azaz az időbélyegeket, valamint a fájl elérési útját, felhasználói azonosítóját és csoportazonosítóját, a fájl linkjeit és a fájl tartalmának fizikai címe.
Mondhatjuk, hogy az inode minden olyan adatot tartalmaz, amely a stat () rendszerhíváshoz szükséges, és ez az index száma a fájl számára, amelyet az inode tábla ment. Amikor létrehoz egy fájlt, létrehoz egy inode számot a fájlhoz. A stat rendszerhívás használatával a rendszer táblázatai 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:
#includeA Stat a fájl állapotának lekérésére szolgál. A C stat rendszerhívás szintaxisa nem minden operációs rendszer esetében lehet azonos. Linuxban a stat rendszerhívás szintaxisa a következő:
int stat (const char * elérési út, struct stat * buf)A függvény visszatérési típusa int, ha a függvény sikeresen végrehajtásra kerül, akkor 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 link, akkor a fájlnév helyett meg kell adnia a hivatkozást.
Ezután a függvényben van egy stat szerkezete amelyben a fájlra vonatkozó adatokat vagy információkat tárolják, amely egy megnevezett mutatót használ buf, amelyet paraméterként adnak át és a hívás végrehajtása során kitöltik, és a felhasználó a hívás után olvasható.
Stat szerkezet:
A stat struktúra, amelyet a
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_t st_size;
struct timspec st_atim;
struct timspec st_mtim;
struct timspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
;
Leírás:
- st_dev: Azon eszköz azonosítója, amelyben a fájlunk jelenleg tartózkodik.
- st_rdev: Ez a mező azt írja le, hogy egy adott fájl egy adott eszközt képvisel.
- st_ino: Ez a fájl inode vagy sorozatszáma. Mivel ez indexszám, ezért minden fájlnak egyedinek kell lennie
- st_size: Az st_size a fájl mérete bájtokban.
- st_atime: Ez a fájl legutóbbi vagy legutóbbi időpontja.
- st_ctime: A fájl állapotának vagy engedélyeinek megváltoztatásának legutóbbi időpontja.
- st_mtime: Ez az utóbbi időben történt a fájl módosítása.
- st_blksize: Ez a mező megadja az I / O fájlrendszer számára előnyben részesített blokkméretet, amely fájlról fájlra változhat.
- st_blocks: Ez a mező megmondja a blokkok teljes számát 512 bájt többszöröseként.
- st_nlink: Ez a mező megadja a hard linkek számát.
- st_uid: Ez a mező a felhasználói azonosítót jelöli.
- st_gid: Ez a mező a csoport azonosítóját jelöli.
- st_mode: Jelzi a fájl engedélyeit, megmondja a fájl módjait. Az alábbiakban megadjuk azokat a zászlókat, amelyeket meg kell adni az st_mode mező számára:
Zászlók | Leírás | Flag érték |
---|---|---|
S_IFMT | A fájl módértékének lekérésére használt bitmaszk | 0170000 |
S_IFSOCK | A socket fájlállandója | 0140000 |
S_IFLINK | A szimbolikus link fájlállandója | 0120000 |
S_IFREG | Fájlállandó a szokásos 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ó a karakterfájlhoz | 0020000 |
S_IFIFO | Fájlállandó: fifo | 0010000 |
S_ISUID | Állítsa be a User ID bitet | 0004000 |
S_ISGID | Állítsa be a Group ID bitet | 0002000 |
S_ISVTX | Ragadós bit, amely a megosztott szöveget jelzi | 0001000 |
S_IRWXU | Tulajdonos engedélyei (olvasás, írás, végrehajtás) | 00700 |
S_IRUSR | Olvassa el a tulajdonos engedélyeit | 00400 |
S_IWUSR | Írási engedélyek a tulajdonosnak | 00200 |
S_IXUSR | Engedélyek végrehajtása 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 engedélyeit | 00040 |
S_IWGRP | Írja meg a csoport engedélyeit | 00020 |
S_IXGRP | Végezze el a csoport engedélyeit | 00010 |
S_IRWXO | Engedélyek mások számára (olvasás, írás, végrehajtás) | 00007 |
S_IROTH | Olvassa el mások engedélyeit | 00004 |
S_IWOTH | Írási engedélyek másoknak | 00002 |
S_IXOTH | Engedélyek végrehajtása mások számára | 00001 |
A Stat rendszerhívás használata:
Az alábbi példa bemutatja, hogyan kell használni a stat rendszerhívást C programozási nyelven Linux, Ubuntu rendszerben.
1. példa:
A következő kódban meg fogjuk találni a fájl módját:
KÓD:
#include#include
int main ()
// mutató a stat struktúrára
struct stat sfile;
// stat rendszerhívás
stat ("stat.c ", & sfájl);
// st_mode elérése (a stat struct adattagja)
printf ("st_mode =% o", sfile.st_mode);
visszatér 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 az egérmutatót a stat struktúrába, amely sfile. Ezután a stat struct mutatóját az st_mode elérésére használják, amely a fájl módját jeleníti meg a printf utasítás segítségével.
A fejlécfájl
2. példa:
A következő kódban információkat kapunk a fájlról a stat rendszerhívás segítségével:
KÓD:
#include#include
#include
#include
void sfile (char const fájlnév []);
int main ()
ssize_t olvasni;
char * puffer = 0;
méret_t buf_méret = 0;
printf ("Írja be az ellenőrzendő fájl nevét: \ n");
read = getline (& puffer, & buf_size, stdin);
ha (olvassa el <=0 )
printf ("nem sikerült a getline \ n");
kilépés (1);
if (puffer [read-1] == '\ n')
puffer [read-1] = 0;
int s = nyitott (puffer, O_RDONLY);
ha (s == - 1)
printf ("A fájl nem létezik \ n");
kilépés (1);
más
sfile (puffer);
szabad (puffer);
visszatér 0;
void sfile (char const fájlnév [])
struct stat sfile;
if (stat (fájlnév, & sfájl) == - 1)
printf ("Hiba történt \ n");
// A stat struct adat tagjainak elérése
printf ("\ nFájl st_uid% d \ n", sfile.st_uid);
printf ("\ nFájl st_blksize% ld \ n", sfile.st_blksize);
printf ("\ nFájl st_gid% d \ n", sfile.st_gid);
printf ("\ nFájl st_blocks% ld \ n", sfile.st_blocks);
printf ("\ nFájl st_size% ld \ n", sfile.st_size);
printf ("\ nFájl st_nlink% u \ n", (aláíratlan int) sfile.st_nlink);
printf ("\ nFájlengedélyek felhasználó \ 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 ("\ nFájljogosultsági csoport \ 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 ("\ nFájlengedélyek Egyéb \ n");
printf ((sfile.st_mode & S_IROTH)? "r": "-");
printf ((sfile.st_mode & S_IWOTH)? "w": "-");
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 mutatja a következő kép:
Ha létezik fájlunk, akkor az sfile (n) függvény meghívásra kerül, amelyben átadtuk a fájl nevét. A függvényben először is a Stat rendszerhívást használtuk, ha a stat () -1-et ad vissza, akkor e hibának kell lennie, így üzenetet nyomtat és a program végrehajtása leáll.
Ezután a printf utasításban a function és a dot elválasztó nevét használtuk az adatok tagjainak eléréséhez stat struktúra.
Ezután a fájl módjához hozzáférünk az st_mode makróihoz vagy zászlóihoz. Itt a logikai és az operátor segítségével nyomtatják ki a megfelelő módokat. Ellenőriztük a felhasználó, a csoport és mások engedélyeit a megadott fájlhoz (a felhasználó által megadott fájlnév).
Ezzel láthatja, hogyan használhatja a stat programhívást a C programozási nyelvből, hogy információkat szerezzen az OS kernelből a fájlokról. Ha kérdése van, nyugodtan mondja el nekünk a megjegyzés részben.