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:
#includeStat 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
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:
- st_dev: Het is de ID van het apparaat waarin we ons bestand momenteel hebben.
- st_rdev: Dit veld beschrijft dat een bepaald bestand een bepaald apparaat vertegenwoordigt.
- st_ino: Het is het inodenummer of het serienummer van het bestand. Omdat het een indexnummer is, moet het uniek zijn voor alle bestanden
- st_maat: st_size is de grootte van het bestand in bytes.
- st_atime: Het is de laatste keer of de recente tijd waarop het bestand is geopend.
- st_ctime: Het is het recente tijdstip waarop de status of de machtigingen van het bestand zijn gewijzigd.
- st_mtime: Het is het recente tijdstip waarop het bestand is gewijzigd.
- st_blksize: Dit veld geeft de gewenste blokgrootte voor het I/O-bestandssysteem, die van bestand tot bestand kan verschillen.
- st_blocks: Dit veld vertelt het totale aantal blokken in veelvouden van 512 bytes.
- st_nlink: Dit veld geeft het totale aantal harde links aan.
- st_uid: Dit veld geeft de gebruikers-ID aan.
- st_gid: Dit veld geeft de groeps-ID aan.
- 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
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.