Systeemoproepen

Stat System Call Linux Tutorial

Stat System Call Linux Tutorial

Linux-systeemaanroepen

Systeemaanroepen die door de linux-kernel worden geleverd, worden weergegeven in de programmeertaal C via glibc.  Wanneer een systeemaanroep wordt gebruikt, communiceert u met het besturingssysteem en bij terugkomst communiceert het besturingssysteem met u via de parameters die worden geretourneerd naar 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:

#include

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

int stat(const char *path, struct stat *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 a stat-structuur waarin de gegevens of informatie over het bestand zijn 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 header-bestand bevat de volgende velden:

struct stat

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;
;

Omschrijving:

  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 vertelt het totale aantal blokken 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 Omschrijving 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-systeemaanroep in C-programmeertaal gebruikt in Linux, Ubuntu.

VOORBEELD 1:

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

CODE:

#include
#include
int hoofd()

// aanwijzer naar stat struct
struct stat-bestand;
//stat systeemoproep
stat("stat.c", &sfile);
// toegang tot st_mode (gegevenslid van stat struct)
printf("st_mode = %o", sfile.st_mode);
retourneer 0;

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

In deze code hebben we de naam van het bestand doorgegeven in stat system call 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 system call kunt gebruiken. Het header-bestand is het standaard invoer-/uitvoerbibliotheekbestand 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:

#include
#include
#include
#include
void sfile (char const bestandsnaam []);
int hoofd()
ssize_t gelezen;
char* buffer = 0;
size_t buf_size = 0;
printf("Vul de naam van een te controleren bestand in: \n");
read = getline(&buffer, &buf_size, stdin);
als (lees) <=0 )
printf("getline mislukt\n");
uitgang(1);

if (buffer[lees-1] == '\n')
buffer [lees-1] = 0;

int s=open(buffer,O_RDONLY);
if(s==-1)
printf("Bestand bestaat niet\n");
uitgang(1);

anders
bestand (buffer);

gratis (buffer);
retourneer 0;

void sfile(char const bestandsnaam[])
struct stat-bestand;
if(stat(bestandsnaam,&sbestand)==-1)
printf("Er is een fout opgetreden\n");

// Toegang tot gegevensleden van stat struct
printf("\nFile st_uid %d \n",sfile.st_uid);
printf("\nBestand st_blksize %ld \n",sfile.st_blksize);
printf("\nBestand st_gid %d \n",sfile.st_gid);
printf("\nBestand st_blocks %ld \n",sfile.st_blocks);
printf("\nBestand st_grootte %ld \n",sfile.st_grootte);
printf("\nBestand st_nlink %u \n",(unsigned int)sfile.st_nlink);
printf("\nBestandsmachtigingen Gebruiker\n");
printf((bestand.st_mode & S_IRUSR)? "r":"-");
printf((bestand.st_mode & S_IWUSR)? "w":"-");
printf((bestand.st_mode & S_IXUSR)? "X":"-");
printf("\n");
printf("\nBestandsmachtigingengroep\n");
printf((bestand.st_mode & S_IRGRP)? "r":"-");
printf((bestand.st_mode & S_IWGRP)? "w":"-");
printf((bestand.st_mode & S_IXGRP)? "X":"-");
printf("\n");
printf("\nBestandsmachtigingen Overig\n");
printf((bestand.st_mode & S_IROTH)? "r":"-");
printf((bestand.st_mode & S_IWOTH)? "w":"-");
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 de 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 van de OS-kernel over bestanden te krijgen.  Als je een vraag hebt, laat het ons dan weten via de commentaarsectie.

OSD-overlay tonen in Linux-apps en -games op volledig scherm
Het spelen van games op volledig scherm of het gebruik van apps in de modus volledig scherm zonder afleiding kan u afsnijden van relevante systeeminfo...
Top 5 Game Capture-kaarten
We hebben allemaal gezien en genoten van streaming gameplays op YouTube. PewDiePie, Jakesepticye en Markiplier zijn slechts enkele van de beste gamers...
Hoe een spel op Linux te ontwikkelen
Tien jaar geleden zouden niet veel Linux-gebruikers voorspellen dat hun favoriete besturingssysteem ooit een populair spelplatform voor commerciële vi...