Tutorial Stat System Call Linux

Stat System Call Linux Tutorial



Apelurile de sistem furnizate de kernel-ul Linux sunt expuse în limbajul de programare C prin glibc. Când se utilizează un apel de sistem, comunicați cu sistemul de operare și, la întoarcere, sistemul de operare vă comunică prin intermediul parametrilor care sunt returnați la funcțiile de apel de sistem (valori de retur).

Apel sistem de stat:

Apelul de sistem stat este un apel de sistem în Linux pentru a verifica starea unui fișier, de exemplu pentru a verifica când a fost accesat fișierul. Apelul de sistem stat () returnează de fapt atributele fișierului. Atributele de fișier ale unui inod sunt returnate practic de funcția Stat (). Un inod conține metadatele fișierului. Un inod conține: tipul fișierului, dimensiunea fișierului, când fișierul a fost accesat (modificat, șters), adică ștampilele de timp, și calea fișierului, ID-ul utilizatorului și ID-ul grupului, link-uri ale fișierului , și adresa fizică a conținutului fișierului.







Putem spune că inode conține toate datele necesare pentru apelul de sistem stat () și este numărul de index al fișierului care este salvat în tabelul inode. Ori de câte ori creați un fișier, se creează un număr de inod pentru acel fișier. Folosind apelul de sistem stat, tabelele de sistem pot fi vizualizate.



Sintaxa apelului de sistem C Stat:

Pentru a utiliza apelul de sistem stat în limbajul de programare C, trebuie să includeți următorul fișier antet:



#include

Stat este folosit pentru a obține starea unui fișier. Sintaxa apelului de sistem C stat poate să nu fie aceeași pentru fiecare sistem de operare. În Linux, sintaxa pentru apelul de sistem stat este următoarea:





intstat(const char *cale, structstat*buf)

Tipul de returnare a funcției în int, dacă funcția este executată cu succes, 0 este returnat dacă există erori, -1 va fi returnat.

Aici const char * cale specifică numele fișierului. Dacă calea fișierului este o legătură simbolică, atunci trebuie să specificați legătura în loc de numele fișierului.



Apoi în funcție avem o structură statică în care sunt stocate datele sau informațiile despre fișier care utilizează un pointer numit buf, care este transmis ca parametru și completat în timpul executării apelului și lizibil de către utilizator după apel.

Structura statistică:

Structura statistică care este definită în fișierul antet conține următoarele câmpuri:

structstat
{
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;
};

Descriere:

  1. st_dev: Este ID-ul dispozitivului în care avem fișierul rezident în prezent.
  2. st_rdev: Acest câmp descrie faptul că un anumit fișier reprezintă un anumit dispozitiv.
  3. st_ino: Este numărul inodului sau numărul de serie al fișierului. Deoarece este un număr index, ar trebui să fie unic pentru toate fișierele
  4. st_size: st_size este dimensiunea fișierului în octeți.
  5. st_atime: Este ultima dată sau ultima dată la care a fost accesat fișierul.
  6. st_ctime: Este momentul recent la care s-a schimbat starea sau permisiunile fișierului.
  7. st_mtime: Este momentul recent la care fișierul a fost modificat.
  8. st_blksize: Acest câmp oferă dimensiunea blocului preferată pentru sistemul de fișiere I / O, care poate varia de la fișier la fișier.
  9. st_blocks: Acest câmp indică numărul total de blocuri în multipli de 512 octeți.
  10. st_nlink: Acest câmp indică numărul total de legături hard.
  11. st_uid: Acest câmp indică ID-ul utilizatorului.
  12. st_gid: Acest câmp indică ID-ul grupului.
  13. st_mode: Indică permisiunile pentru fișier, indică modurile unui fișier. Următoarele sunt steagurile care ar trebui definite pentru câmpul st_mode:
Steaguri Descriere Valoare semnal
S_IFMT O mască de biți utilizată pentru a obține valoarea modului unui fișier 0170000
S_IFSOCK O constantă de fișier a socketului 0140000
S_IFLINK O constantă de fișier de legătură simbolică 0120000
S_IFREG Constanta de fisier pentru fisierul obisnuit 0100000
S_IFBLK Constanta de fisier pentru fisierul bloc 0060000
S_IFDIR Constanta de fisier pentru fisierul director 0040000
S_IFCHR Constanta de fisier pentru fisierul de caractere 0020000
S_IFIFO Un fișier constant de fifo 0010000
S_ISUID Setați bitul ID utilizator 0004000
S_ISGID Setați bitul ID grup 0002000
S_ISVTX Bit lipicios care indică textul partajat 0001000
S_IRWXU Permisiunile proprietarului (citire, scriere, executare) 00700
S_IRUSR Citiți permisiunile pentru proprietar 00400
S_IWUSR Permisiuni de scriere pentru proprietar 00200
S_IXUSR Executați permisiuni pentru proprietar 00100
S_IRWXG Permisiuni de grup (citire, scriere, executare) 00070
S_IRGRP Citiți permisiunile pentru grup 00040
S_IWGRP Permisiuni de scriere pentru grup 00020
S_IXGRP Executați permisiuni pentru grup 00010
S_IRWXO Permisiuni pentru alte persoane (citire, scriere, executare) 00007
S_IROTH Citiți permisiunile pentru alții 00004
S_IWOTH Scrieți permisiuni pentru alții 00002
S_IXOTH Executați permisiuni pentru alții 00001

Cum se utilizează apelul de sistem Stat:

Următorul exemplu arată cum să utilizați apelul de sistem stat în limbajul de programare C în Linux, Ubuntu.

EXEMPLUL 1:

În următorul cod vom găsi modul unui fișier:

COD:

#include
#include
intprincipal()
{
// pointer către stat struct
structstat sfile;

// apel sistem stat
stat('stat.c', &sfile);

// accesarea st_mode (membru de date al struct struct)
printf ('st_mode =% o',sfile.st_mode);
întoarcere 0;
}

Compilarea și rularea programului revine după cum urmează:

În acest cod, am trecut numele fișierului în apelul de sistem stat și apoi pointerul către stat struct care este sfile. Pointerul către stat struct este apoi utilizat pentru a accesa st_mode care afișează modul fișierului folosind instrucțiunea printf.

Fișierul antet este utilizat, astfel încât să puteți utiliza apelul de sistem stat. Fișierul antet este fișierul standard de bibliotecă de intrare / ieșire, astfel încât să puteți utiliza printf sau scanf în codul dvs. C.

EXEMPLUL 2:

În următorul cod, vom obține informații despre fișier folosind apel sistem de stat:

COD:

#include
#include
#include
#include

nulsfile(char constnume de fișier[]);

intprincipal(){
ssize_t citit;
char*tampon= 0;
mărime_tbuf_size= 0;

printf ('Introduceți numele unui fișier pentru a verifica: n');
citit=getline(&tampon, &buf_size,stdin);

dacă (citit<=0 ){
printf ('getline a eșuat n');
Ieșire (1);
}

dacă (tampon[citit-1] == ' n'){
tampon[citit-1] = 0;
}

ints=deschis(tampon,O_RDONLY);
dacă(s== -1){
printf („Fișierul nu există n');
Ieșire (1);
}
altceva{
sfile(tampon);
}
liber (tampon);
întoarcere 0;
}

nulsfile(char constnume de fișier[]){

structstat sfile;

dacă(stat(nume de fișier, &sfile)== -1){
printf ('A apărut o eroare n');
}

// Accesarea datelor membrilor stat struct
printf (' nFișier st_uid% d n',sfile.st_uid);
printf (' nFișier st_blksize% ld n',sfile.st_blksize);
printf (' nFișier st_gid% d n',sfile.st_gid);
printf (' nFișier st_blocks% ld n',sfile.st_blocks);
printf (' nFișier st_size% ld n',sfile.st_size);
printf (' nFișier st_nlink% u n',(nesemnat int)sfile.st_nlink);
printf (' nUtilizator de permisiuni de fișiere n');
printf ((sfile.st_mode &S_IRUSR)? 'r':„-”);
printf ((sfile.st_mode &S_IWUSR)? 'în':„-”);
printf ((sfile.st_mode &S_IXUSR)? 'X':„-”);
printf (' n');
printf (' nGrup de permisiuni de fișiere n');
printf ((sfile.st_mode &S_IRGRP)? 'r':„-”);
printf ((sfile.st_mode &S_IWGRP)? 'în':„-”);
printf ((sfile.st_mode &S_IXGRP)? 'X':„-”);
printf (' n');
printf (' nPermisiuni de fișiere Altele n');
printf ((sfile.st_mode &S_IROTH)? 'r':„-”);
printf ((sfile.st_mode &S_IWOTH)? 'în':„-”);
printf ((sfile.st_mode &S_IXOTH)? 'X':„-”);
printf (' n');
}

IEȘIRE:

În codul C de mai sus, am introdus numele fișierului și dacă fișierul nu există, executarea programului va fi oprită. Acest lucru este demonstrat în următoarea imagine:

Dacă fișierul nostru există, va fi apelată funcția sfile (n) în care am trecut numele fișierului. În interiorul funcției, în primul rând am folosit apelul de sistem Stat, dacă stat () returnează -1, atunci trebuie să existe orice eroare, astfel încât un mesaj să fie tipărit și executarea programului să fie oprită.

Apoi, în declarația printf, am folosit numele funcției și separatorul de puncte pentru a accesa membrii datelor din stat struct .

Apoi, pentru modul de fișier, am accesat macrocomenzile sau steagurile st_mode. Aici este utilizat logic și operator pentru a imprima modurile respective. Am verificat dacă există permisiuni pentru utilizator, grup și altele pentru fișierul specificat (numele fișierului introdus de utilizator).

Cu aceasta puteți vedea cum să utilizați apelul de sistem stat din limbajul de programare C pentru a obține informații din kernel-ul OS despre fișiere. Dacă aveți o întrebare, nu ezitați să ne spuneți prin secțiunea de comentarii.