Linux sistēmas zvani
Sistēmas zvani, ko nodrošina Linux kodols, tiek pakļauti C programmēšanas valodā, izmantojot glibc. Ja tiek izmantots sistēmas zvans, jūs sazināties ar OS un pēc atgriešanās OS sazinās ar jums, izmantojot parametrus, kas tiek atgriezti sistēmas izsaukuma funkcijās (atgriešanās vērtības).
Stat sistēmas izsaukums:
Stat sistēmas izsaukums ir sistēmas izsaukums Linux, lai pārbaudītu faila statusu, piemēram, lai pārbaudītu, kad failam tika piekļūts. Sistēmas izsaukums stat () faktiski atgriež faila atribūtus. Inoda faila atribūtus pamatā atgriež funkcija Stat (). Inode satur faila metadatus. Inode satur: faila veidu, faila lielumu, kad failam tika piekļūts (modificēts, dzēsts), tas ir laika zīmogi, un faila ceļu, lietotāja ID un grupas ID, faila saites un faila satura fiziskā adrese.
Mēs varam teikt, ka inode satur visus datus, kas nepieciešami stat () sistēmas izsaukumam, un tas ir faila indeksa numurs, kas tiek saglabāts inode tabulā. Ikreiz, kad izveidojat failu, šim failam tiek izveidots inoda numurs. Izmantojot stat sistēmas izsaukumu, var apskatīt sistēmas tabulas.
C Stat sistēmas izsaukuma sintakse:
Lai izmantotu stat sistēmas izsaukumu C programmēšanas valodā, jums jāiekļauj šāds galvenes fails:
# iekļautStat tiek izmantots faila statusa iegūšanai. C stat sistēmas izsaukuma sintakse katrai operētājsistēmai var nebūt vienāda. Linux sistēmā sistēmas izsaukuma sintakse ir šāda:
int stat (const char * ceļš, struct stat * buf)Funkcijas atgriešanās tips int, Ja funkcija ir veiksmīgi izpildīta, 0 tiek atgriezta, ja ir kādas kļūdas, -1 tiks atgriezta.
Šeit const char * ceļš norāda faila nosaukumu. Ja faila ceļš ir simboliska saite, faila nosaukuma vietā jānorāda saite.
Tad funkcijā mums ir a stat struktūra kurā tiek glabāti dati vai informācija par failu, kurā tiek izmantots rādītājs ar nosaukumu buf, kas tiek ievadīts kā parametrets un aizpildīts zvana izpildes laikā un ko lietotājs var nolasīt pēc zvana.
Stat struktūra:
Stat struktūra, kas definēta
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;
;
Apraksts:
- st_dev: Tas ir tās ierīces ID, kurā pašlaik atrodas mūsu fails.
- st_rdev: Šajā laukā ir aprakstīts, ka konkrēts fails apzīmē noteiktu ierīci.
- st_ino: Tas ir faila inoda numurs vai sērijas numurs. Tā kā tas ir indeksa numurs, tam jābūt unikālam visiem failiem
- st_size: st_size ir faila lielums baitos.
- st_atime: Tas ir pēdējais vai pēdējais laiks, kad tika piekļūts failam.
- st_ctime: Tas ir pēdējais laiks, kad tika mainīts faila statuss vai atļaujas.
- st_mtime: Šis ir pēdējais laiks, kad fails tika modificēts.
- st_blksize: Šis lauks norāda vēlamo I / O failu sistēmas bloka lielumu, kas katrā failā var atšķirties.
- st_blocks: Šis lauks norāda kopējo bloku skaitu 512 baitu reizinājumos.
- st_nlink: Šis lauks norāda kopējo cieto saišu skaitu.
- st_uid: Šis lauks norāda lietotāja ID.
- st_gid: Šis lauks norāda grupas ID.
- st_mode: Tas norāda faila atļaujas, norāda faila režīmus. Tālāk ir norādīti karodziņi laukam st_mode:
Karogi | Apraksts | Karoga vērtība |
---|---|---|
S_IFMT | Bitmaska, ko izmanto, lai iegūtu faila režīma vērtību | 0170000 |
S_IFSOCK | Socket faila konstante | 0140000 |
S_IFLINK | Simboliskas saites faila konstante | 0120000 |
S_IFREG | Faila konstante parastam failam | 0100000 |
S_IFBLK | Bloka faila faila konstante | 0060000 |
S_IFDIR | Faila konstante direktorija failam | 0040000 |
S_IFCHR | Faila konstante rakstzīmju failam | 0020000 |
S_IFIFO | Faila konstante ir pieci | 0010000 |
S_ISUID | Iestatiet User ID bitu | 0004000 |
S_ISGID | Iestatiet grupas ID bitu | 0002000 |
S_ISVTX | Lipīgs uzgalis, kas norāda koplietojamo tekstu | 0001000 |
S_IRWXU | Īpašnieka atļaujas (lasīšana, rakstīšana, izpilde) | 00700 |
S_IRUSR | Lasīt īpašnieka atļaujas | 00400 |
S_IWUSR | Rakstīšanas atļaujas īpašniekam | 00200 |
S_IXUSR | Izpildiet īpašnieka atļaujas | 00100 |
S_IRWXG | Grupas atļaujas (lasīšana, rakstīšana, izpilde) | 00070 |
S_IRGRP | Lasīt grupas atļaujas | 00040 |
S_IWGRP | Rakstīšanas atļaujas grupai | 00020 |
S_IXGRP | Izpildiet grupas atļaujas | 00010 |
S_IRWXO | Atļaujas citiem (lasīt, rakstīt, izpildīt) | 00007 |
S_IROTH | Lasiet atļaujas citiem | 00004 |
S_IWOTH | Rakstīšanas atļaujas citiem | 00002 |
S_IXOTH | Izpildiet atļaujas citiem | 00001 |
Kā izmantot Stat sistēmas izsaukumu:
Šis piemērs parāda, kā izmantot stat sistēmas izsaukumu C programmēšanas valodā Linux, Ubuntu.
1. PIEMĒRS:
Šajā kodā mēs atradīsim faila režīmu:
KODS:
# iekļaut# iekļaut
int main ()
// rādītājs uz stat struktūru
struct stat sfile;
// stat sistēmas izsaukums
stat ("stat.c ", & sfile);
// piekļuve st_mode (stat struct datu loceklis)
printf ("st_mode =% o", sfile.st_mode);
atgriešanās 0;
Programmas apkopošana un palaišana atgriežas šādi:
Šajā kodā mēs esam nodevuši faila nosaukumu stat sistēmas izsaukumā un pēc tam rādītāju uz stat struct, kas ir sfile. Pēc tam stat stat rādītājs tiek izmantots, lai piekļūtu st_mode, kas parāda faila režīmu, izmantojot printf paziņojumu.
Galvenes fails
2. PIEMĒRS:
Šajā kodā mēs iegūsim informāciju par failu, izmantojot stat sistēmas izsaukumu:
KODS:
# iekļaut# iekļaut
# iekļaut
# iekļaut
void sfile (char const faila nosaukums []);
int main ()
ssize_t lasīt;
char * buferis = 0;
izmērs_t buf_izmērs = 0;
printf ("Ievadiet pārbaudāmā faila nosaukumu: \ n");
lasīt = getline (& buferis, & buf_size, stdin);
ja (lasīt <=0 )
printf ("getline neizdevās \ n");
izeja (1);
ja (buferis [lasīt-1] == '\ n')
buferis [lasīt-1] = 0;
int s = atvērts (buferis, O_RDONLY);
ja (s == - 1)
printf ("Fails nepastāv \ n");
izeja (1);
cits
sfile (buferis);
bezmaksas (buferis);
atgriešanās 0;
void sfile (char const faila nosaukums [])
struct stat sfile;
ja (stat (faila nosaukums, & sfile) == - 1)
printf ("Radās kļūda \ n");
// Piekļuve stat struct datu dalībniekiem
printf ("\ nFails st_uid% d \ n", sfile.st_uid);
printf ("\ nFails st_blksize% ld \ n", sfile.st_blksize);
printf ("\ nFails st_gid% d \ n", sfile.st_gid);
printf ("\ nFails st_blocks% ld \ n", sfile.st_blocks);
printf ("\ nFails st_size% ld \ n", sfile.st_size);
printf ("\ nFails st_nlink% u \ n", (neparakstīts int) sfile.st_nlink);
printf ("\ nFailu atļauju lietotājs \ 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 ("\ nFailu atļauju grupa \ 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 ("\ nFailu atļaujas cits \ n");
printf ((sfile.st_mode & S_IROTH)? "r": "-");
printf ((sfile.st_mode & S_IWOTH)? "w": "-");
printf ((sfile.st_mode & S_IXOTH)? "x": "-");
printf ("\ n");
REZULTĀTS:
Iepriekš minētajā C kodā mēs esam ievadījuši faila nosaukumu un, ja faila nav, programmas izpilde tiks pārtraukta. Tas ir parādīts šādā attēlā:
Ja mūsu fails pastāv, tiks izsaukta funkcija sfile (n), kurā mēs esam nodevuši faila nosaukumu. Funkcijas iekšpusē, pirmkārt, mēs izmantojām Stat sistēmas izsaukumu, ja stat () atgriež -1, tad ir jābūt kļūdai, tāpēc tiks izdrukāts ziņojums un programmas izpilde tiks pārtraukta.
Tad printf paziņojumā esam izmantojuši funkcijas nosaukumu un punktu atdalītāju, lai piekļūtu datu dalībniekiem stat strukt.
Pēc tam faila režīmam mēs esam piekļuvuši st_mode makro vai karodziņiem. Šeit loģiskais un operators tiek izmantots, lai drukātu attiecīgos režīmus. Mēs esam pārbaudījuši lietotāja, grupas un citu lietotāju atļaujas norādītajam failam (lietotāja ievadītajam faila nosaukumam).
Ar to jūs varat redzēt, kā izmantot stat sistēmas zvanu no C programmēšanas valodas, lai iegūtu informāciju no OS kodola par failiem. Ja jums ir jautājums, pastāstiet mums, izmantojot komentāru sadaļu.