Stat System Call Linux Tutorial

Stat System Call Linux Tutorial



Systeemaanroepen die door de linux-kernel worden geleverd, worden via glibc weergegeven in de programmeertaal C. Wanneer een systeemaanroep wordt gebruikt, communiceert u met het besturingssysteem en bij terugkomst communiceert het besturingssysteem met u via de parameters die worden teruggestuurd naar de systeemaanroepfuncties (retourwaarden).

Stat-systeemoproep:

Stat-systeemaanroep is een systeemaanroep in Linux om de status van een bestand te controleren, bijvoorbeeld om te controleren wanneer het bestand is geopend. De systeemaanroep stat() retourneert feitelijk bestandskenmerken. De bestandsattributen van een inode worden in principe geretourneerd door de functie Stat(). Een inode bevat de metadata van het bestand. Een inode bevat: het type bestand, de grootte van het bestand, wanneer het bestand werd geopend (gewijzigd, verwijderd), dat wil zeggen tijdstempels, en het pad van het bestand, de gebruikers-ID en de groeps-ID, links van het bestand , en fysiek adres van bestandsinhoud.







We kunnen zeggen dat inode alle gegevens bevat die nodig zijn voor de systeemaanroep stat() en dat het het indexnummer is voor het bestand dat is opgeslagen in de inode-tabel. Telkens wanneer u een bestand aanmaakt, wordt er een inodenummer voor dat bestand gemaakt. Met behulp van stat system call kunnen de systeemtabellen worden bekeken.



Syntaxis van C Stat-systeemaanroep:

Om de stat-systeemaanroep in de programmeertaal C te gebruiken, moet u het volgende headerbestand opnemen:



#erbij betrekken

Stat wordt gebruikt om de status van een bestand te krijgen. De syntaxis van de C stat-systeemaanroep is mogelijk niet voor elk besturingssysteem hetzelfde. In Linux is de syntaxis voor stat-systeemaanroep als volgt:





intstaat(const char *pad, structurerenstaat*buf)

Het retourtype van de functie in int, als de functie met succes is uitgevoerd, wordt 0 geretourneerd als er fouten zijn, wordt -1 geretourneerd.

Hier const char *pad specificeert de naam van het bestand. Als het pad van het bestand een symbolische link is, moet je de link specificeren in plaats van de bestandsnaam.



Dan hebben we in de functie een stat-structuur waarin de gegevens of informatie over het bestand worden opgeslagen die een aanwijzer gebruiken met de naam buf, die als parameter wordt doorgegeven en tijdens de uitvoering van de oproep wordt ingevuld en na de oproep voor de gebruiker leesbaar is.

Statistiek structuur:

De stat-structuur die is gedefinieerd in het headerbestand bevat de volgende velden:

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

Beschrijving:

  1. st_dev: Het is de ID van het apparaat waarin we ons bestand momenteel hebben.
  2. st_rdev: Dit veld beschrijft dat een bepaald bestand een bepaald apparaat vertegenwoordigt.
  3. st_ino: Het is het inodenummer of het serienummer van het bestand. Omdat het een indexnummer is, moet het uniek zijn voor alle bestanden
  4. st_maat: st_size is de grootte van het bestand in bytes.
  5. st_atime: Het is de laatste keer of de recente tijd waarop het bestand is geopend.
  6. st_ctime: Het is het recente tijdstip waarop de status of de machtigingen van het bestand zijn gewijzigd.
  7. st_mtime: Het is het recente tijdstip waarop het bestand is gewijzigd.
  8. st_blksize: Dit veld geeft de gewenste blokgrootte voor het I/O-bestandssysteem, die van bestand tot bestand kan verschillen.
  9. st_blocks: Dit veld geeft het totale aantal blokken aan in veelvouden van 512 bytes.
  10. st_nlink: Dit veld geeft het totale aantal harde links aan.
  11. st_uid: Dit veld geeft de gebruikers-ID aan.
  12. st_gid: Dit veld geeft de groeps-ID aan.
  13. st_mode: Het geeft de rechten op het bestand aan, vertelt de modi op een bestand. Hieronder volgen de vlaggen die moeten worden gedefinieerd voor het veld st_mode:
vlaggen Beschrijving Vlagwaarde
S_IFMT Een bitmasker dat wordt gebruikt om de moduswaarde van een bestand te krijgen 0170000
S_IFSOCK Een bestandsconstante van socket 0140000
S_IFLINK Een bestandsconstante van symbolische link 0120000
S_IFREG Bestandsconstante voor normaal bestand 0100000
S_IFBLK Bestandsconstante voor blokbestand 0060000
S_IFDIR Bestandsconstante voor directorybestand 0040000
S_IFCHR Bestandsconstante voor karakterbestand 0020000
S_IFIFO Een bestandsconstante van fifo 0010000
S_ISUID Stel gebruikers-ID-bit in 0004000
S_ISGID Groeps-ID-bit instellen 0002000
S_ISVTX Sticky bit dat gedeelde tekst aangeeft 0001000
S_IRWXU Eigenaarsmachtigingen (lezen, schrijven, uitvoeren) 00700
S_IRUSR Leesrechten voor eigenaar 00400
S_IWUSR Schrijfrechten voor eigenaar 00200
S_IXUSR Uitvoeringsmachtigingen voor eigenaar 00100
S_IRWXG Groepsmachtigingen (lezen, schrijven, uitvoeren) 00070
S_IRGRP Leesrechten voor groep 00040
S_IWGRP Schrijfrechten voor groep 00020
S_IXGRP Uitvoeringsmachtigingen voor groep 00010
S_IRWXO Machtigingen voor anderen (lezen, schrijven, uitvoeren) 00007
S_IROTH Leesmachtigingen voor anderen 00004
S_IWOTH Schrijfmachtigingen voor anderen 00002
S_IXOTH Machtigingen uitvoeren voor anderen 00001

Stat-systeemoproep gebruiken:

Het volgende voorbeeld laat zien hoe u stat system call in C programmeertaal gebruikt in Linux, Ubuntu.

VOORBEELD 1:

In de volgende code gaan we de modus van een bestand zoeken:

CODE:

#erbij betrekken
#erbij betrekken
inthoofd()
{
// aanwijzer naar stat struct
structurerenstaatsbestand;

//stat systeemoproep
staat('stat.c', &bestand);

// toegang tot st_mode (gegevenslid van stat struct)
printf ('st_mode = %o',bestand.st_mode);
opbrengst 0;
}

Het compileren en uitvoeren van het programma komt als volgt terug:

In deze code hebben we de naam van het bestand in stat system call doorgegeven en vervolgens de aanwijzer naar stat struct die sfile is. De aanwijzer naar stat struct wordt vervolgens gebruikt om toegang te krijgen tot st_mode die de modus van het bestand weergeeft met behulp van de printf-instructie.

Het header-bestand wordt gebruikt, zodat u stat-systeemaanroep kunt gebruiken. Het header-bestand is het standaard input/output-bibliotheekbestand, zodat u printf of scanf in uw C-code kunt gebruiken.

VOORBEELD 2:

In de volgende code gaan we informatie over het bestand krijgen met behulp van stat system call:

CODE:

#erbij betrekken
#erbij betrekken
#erbij betrekken
#erbij betrekken

leegtebestand(char constbestandsnaam[]);

inthoofd(){
ssize_t gelezen;
char*buffer= 0;
size_tbuf_size= 0;

printf ('Voer de naam van een bestand in om te controleren:N');
lezen=getline(&buffer, &buf_size,standaard);

indien (lezen<=0 ){
printf ('getline mislukt'N');
Uitgang (1);
}

indien (buffer[lezen-1] == 'N'){
buffer[lezen-1] = 0;
}

ints=open(buffer,O_RDONLY);
indien(s== -1){
printf ('Bestand bestaat niet'N');
Uitgang (1);
}
anders{
bestand(buffer);
}
vrij (buffer);
opbrengst 0;
}

leegtebestand(char constbestandsnaam[]){

structurerenstaatsbestand;

indien(staat(bestandsnaam, &bestand)== -1){
printf ('Fout opgetredenN');
}

// Toegang tot gegevensleden van stat struct
printf ('NBestand st_uid %dN',bestand.st_uid);
printf ('NBestand st_blksize %ldN',bestand.st_blksize);
printf ('NBestand st_gid %dN',bestand.st_gid);
printf ('NBestand st_blocks %ldN',bestand.st_blocks);
printf ('NBestand st_size %ldN',bestand.st_size);
printf ('NBestand st_nlink% uN',(niet ondertekend int)bestand.st_nlink);
printf ('NBestandsmachtigingen GebruikerN');
printf ((bestand.st_mode &S_IRUSR)? 'R':'-');
printf ((bestand.st_mode &S_IWUSR)? 'in':'-');
printf ((bestand.st_mode &S_IXUSR)? 'x':'-');
printf ('N');
printf ('NGroep voor bestandsmachtigingenN');
printf ((bestand.st_mode &S_IRGRP)? 'R':'-');
printf ((bestand.st_mode &S_IWGRP)? 'in':'-');
printf ((bestand.st_mode &S_IXGRP)? 'x':'-');
printf ('N');
printf ('NBestandsmachtigingen OverigeN');
printf ((bestand.st_mode &S_IROTH)? 'R':'-');
printf ((bestand.st_mode &S_IWOTH)? 'in':'-');
printf ((bestand.st_mode &S_IXOTH)? 'x':'-');
printf ('N');
}

UITGANG:

In de bovenstaande C-code hebben we de naam van het bestand ingevoerd en als het bestand niet bestaat, wordt de uitvoering van het programma gestopt. Dit wordt gedemonstreerd in de volgende afbeelding:

Als ons bestand bestaat, wordt de functie sfile(n) aangeroepen waarin we de naam van het bestand hebben doorgegeven. Binnen de functie hebben we allereerst de Stat-systeemaanroep gebruikt, als stat() -1 retourneert, moet er een fout optreden, zodat een bericht wordt afgedrukt en de uitvoering van het programma wordt gestopt.

Vervolgens hebben we in printf-instructie de naam van de functie en het puntscheidingsteken gebruikt om toegang te krijgen tot de gegevensleden van stat-struct .

Dan hebben we voor de bestandsmodus toegang gekregen tot de macro's of vlaggen van st_mode. Hier wordt logisch en operator gebruikt om de respectieve modi af te drukken. We hebben gecontroleerd op machtigingen voor gebruiker, groep en anderen voor het opgegeven bestand (bestandsnaam ingevoerd door gebruiker).

Hiermee kunt u zien hoe u de stat-systeemaanroep van de C-programmeertaal kunt gebruiken om informatie uit de OS-kernel over bestanden te krijgen. Als je een vraag hebt, laat het ons dan gerust weten via de commentaarsectie.