Vom Linux-Kernel bereitgestellte Systemaufrufe werden in der Programmiersprache C über glibc bereitgestellt. Wenn ein Systemaufruf verwendet wird, kommunizieren Sie mit der OS und bei der Rückkehr kommuniziert die OS mit Ihnen über die Parameter, die an Systemaufruffunktionen zurückgegeben werden (Rückgabewerte).
Stat Systemaufruf:
Stat-Systemaufruf ist ein Systemaufruf in Linux, um den Status einer Datei zu überprüfen, beispielsweise um zu überprüfen, wann auf die Datei zugegriffen wurde. Der Systemaufruf stat() gibt tatsächlich Dateiattribute zurück. Die Dateiattribute eines Inodes werden grundsätzlich von der Funktion Stat() zurückgegeben. Ein Inode enthält die Metadaten der Datei. Ein Inode enthält: den Typ der Datei, die Größe der Datei, wann auf die Datei zugegriffen wurde (geändert, gelöscht), also Zeitstempel, und den Pfad der Datei, die Benutzer-ID und die Gruppen-ID, Links der Datei , und die physische Adresse des Dateiinhalts.
Wir können sagen, dass inode alle Daten enthält, die für den Systemaufruf stat() erforderlich sind, und es ist die Indexnummer für die Datei, die in der inode-Tabelle gespeichert wird. Immer wenn Sie eine Datei erstellen, wird eine Inode-Nummer für diese Datei erstellt. Mittels stat Systemaufruf können die Systemtabellen eingesehen werden.
Syntax des C Stat-Systemaufrufs:
Um den stat-Systemaufruf in der Programmiersprache C zu verwenden, müssen Sie die folgende Header-Datei einbinden:
#enthalten
Stat wird verwendet, um den Status einer Datei abzurufen. Die Syntax des C stat-Systemaufrufs ist möglicherweise nicht für jedes Betriebssystem gleich. Unter Linux lautet die Syntax für den stat-Systemaufruf wie folgt:
intZustand(const verkohlen *Weg, strukturierenZustand*buf)
Der Rückgabetyp der Funktion in int, wenn die Funktion erfolgreich ausgeführt wurde, wird 0 zurückgegeben, wenn Fehler aufgetreten sind, wird -1 zurückgegeben.
Hier const char *Pfad gibt den Namen der Datei an. Wenn der Dateipfad ein symbolischer Link ist, müssen Sie den Link anstelle des Dateinamens angeben.
Dann haben wir in der Funktion eine Statistikstruktur, in der die Daten oder Informationen über die Datei gespeichert werden, die einen Zeiger namens . verwendet buff, die als Parameter übergeben und während der Ausführung des Anrufs ausgefüllt und nach dem Anruf vom Benutzer gelesen werden kann.
Statistikstruktur:
Die in der Header-Datei definierte Statistikstruktur enthält die folgenden Felder:
strukturierenZustand{
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_größe;
strukturierentimspec st_atim;
strukturierentimspec st_mtim;
strukturierentimspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
};
Beschreibung:
- st_dev: Es ist die ID des Geräts, auf dem sich unsere Datei derzeit befindet.
- st_rdev: Dieses Feld beschreibt, dass eine bestimmte Datei ein bestimmtes Gerät repräsentiert.
- st_ino: Es ist die Inode-Nummer oder die Seriennummer der Datei. Da es sich um eine Indexnummer handelt, sollte sie für alle Dateien eindeutig sein
- st_größe: st_size ist die Größe der Datei in Bytes.
- st_atime: Dies ist der letzte oder letzte Zeitpunkt, zu dem auf die Datei zugegriffen wurde.
- st_ctime: Dies ist der letzte Zeitpunkt, zu dem der Status oder die Berechtigungen der Datei geändert wurden.
- st_mtime: Dies ist der Zeitpunkt, zu dem die Datei zuletzt geändert wurde.
- st_blksize: Dieses Feld gibt die bevorzugte Blockgröße für das E/A-Dateisystem an, die von Datei zu Datei variieren kann.
- st_blocks: Dieses Feld gibt die Gesamtanzahl der Blöcke in Vielfachen von 512 Byte an.
- st_nlink: Dieses Feld gibt die Gesamtzahl der Hardlinks an.
- st_uid: Dieses Feld gibt die Benutzer-ID an.
- st_gid: Dieses Feld gibt die Gruppen-ID an.
- st_mode: Es zeigt die Berechtigungen für die Datei an, teilt die Modi einer Datei mit. Im Folgenden sind die Flags aufgeführt, die für das Feld st_mode definiert werden sollten:
Flaggen | Beschreibung | Flag-Wert |
---|---|---|
S_IFMT | Eine Bitmaske, die verwendet wird, um den Moduswert einer Datei zu erhalten | 0170000 |
S_IFSOCK | Eine Dateikonstante von socket | 0140000 |
S_IFLINK | Eine Dateikonstante mit symbolischem Link | 012000 |
S_IFREG | Dateikonstante für reguläre Datei | 0100000 |
S_IFBLK | Dateikonstante für Blockdatei | 0060000 |
S_IFDIR | Dateikonstante für Verzeichnisdatei | 0040000 |
S_IFCHR | Dateikonstante für Zeichendatei | 0020000 |
S_IFIFO | Eine Dateikonstante von fifo | 0010000 |
S_ISUID | Benutzer-ID-Bit setzen | 0004000 |
S_ISGID | Gruppen-ID-Bit setzen | 0002000 |
S_ISVTX | Sticky Bit, das auf geteilten Text hinweist | 0001000 |
S_IRWXU | Besitzerberechtigungen (lesen, schreiben, ausführen) | 00700 |
S_IRUSR | Leseberechtigungen für Eigentümer | 00400 |
S_IWUSR | Schreibberechtigungen für Eigentümer | 00200 |
S_IXUSR | Ausführungsberechtigungen für Eigentümer | 00100 |
S_IRWXG | Gruppenberechtigungen (lesen, schreiben, ausführen) | 00070 |
S_IRGRP | Leseberechtigungen für Gruppe | 00040 |
S_IWGRP | Schreibberechtigungen für Gruppe | 00020 |
S_IXGRP | Ausführungsberechtigungen für Gruppe | 00010 |
S_IRWXO | Berechtigungen für andere (Lesen, Schreiben, Ausführen) | 00007 |
S_IROTH | Leseberechtigungen für andere | 00004 |
S_IWOTH | Schreibberechtigungen für andere | 00002 |
S_IXOTH | Ausführen von Berechtigungen für andere | 00001 |
So verwenden Sie den Stat-Systemaufruf:
Das folgende Beispiel zeigt, wie Sie den stat-Systemaufruf in der Programmiersprache C unter Linux, Ubuntu, verwenden.
BEISPIEL 1:
Im folgenden Code finden wir den Modus einer Datei:
CODE:
#enthalten#enthalten
inthauptsächlich()
{
//Zeiger auf stat struct
strukturierenZustandsdatei;
//Stat Systemaufruf
Zustand('stat.c', &sfile);
//Zugriff auf st_mode (Datenmember der Stat-Struktur)
druckenf ('st_mode = %o',sfile.st_mode);
Rückkehr 0;
}
Das Kompilieren und Ausführen des Programms kehrt wie folgt zurück:
In diesem Code haben wir den Namen der Datei im stat-Systemaufruf übergeben und dann den Zeiger auf die stat-Struktur, die sfile ist. Der Zeiger auf stat struct wird dann verwendet, um auf st_mode zuzugreifen, das den Modus der Datei mit der printf-Anweisung anzeigt.
Die Header-Datei wird verwendet, damit Sie den stat-Systemaufruf verwenden können. Die Header-Datei ist die Standard-Ein-/Ausgabe-Bibliotheksdatei, sodass Sie printf oder scanf in Ihrem C-Code verwenden können.
BEISPIEL 2:
Im folgenden Code erhalten wir Informationen über die Datei mithilfe des stat-Systemaufrufs:
CODE:
#enthalten#enthalten
#enthalten
#enthalten
Leeresfile(verkohlen constDateiname[]);
inthauptsächlich(){
ssize_t lesen;
verkohlen*Puffer= 0;
Größe_tbuf_size= 0;
druckenf ('Geben Sie den Namen einer zu überprüfenden Datei ein: ');
lesen=Getline(&Puffer, &buf_size,stdin);
wenn (lesen<=0 ){
druckenf ('getline fehlgeschlagen ');
Ausfahrt (1);
}
wenn (Puffer[lesen-1] == ' '){
Puffer[lesen-1] = 0;
}
intS=offen(Puffer,O_RDONLY);
wenn(S== -1){
druckenf ('Datei existiert nicht ');
Ausfahrt (1);
}
anders{
sfile(Puffer);
}
kostenlos (Puffer);
Rückkehr 0;
}
Leeresfile(verkohlen constDateiname[]){
strukturierenZustandsdatei;
wenn(Zustand(Dateiname, &sfile)== -1){
druckenf ('Ein Fehler ist aufgetreten ');
}
//Zugriff auf Datenelemente von stat struct
druckenf (' Datei st_uid %d ',sfile.st_uid);
druckenf (' Datei st_blksize %ld ',sfile.st_blksize);
druckenf (' Datei st_gid %d ',sfile.st_gid);
druckenf (' Datei st_blocks %ld ',sfile.st_blocks);
druckenf (' Datei st_size %ld ',sfile.st_größe);
druckenf (' Datei st_nlink% u ',(ohne Vorzeichen int)sfile.st_nlink);
druckenf (' Benutzer mit Dateiberechtigungen ');
druckenf ((sfile.st_mode &S_IRUSR)? 'R':'-');
druckenf ((sfile.st_mode &S_IWUSR)? 'in':'-');
druckenf ((sfile.st_mode &S_IXUSR)? 'x':'-');
druckenf (' ');
druckenf (' Dateiberechtigungsgruppe ');
druckenf ((sfile.st_mode &S_IRGRP)? 'R':'-');
druckenf ((sfile.st_mode &S_IWGRP)? 'in':'-');
druckenf ((sfile.st_mode &S_IXGRP)? 'x':'-');
druckenf (' ');
druckenf (' Dateiberechtigungen Andere ');
druckenf ((sfile.st_mode &S_IROTH)? 'R':'-');
druckenf ((sfile.st_mode &S_IWOTH)? 'in':'-');
druckenf ((sfile.st_mode &S_IXOTH)? 'x':'-');
druckenf (' ');
}
AUSGANG:
Im obigen C-Code haben wir den Dateinamen eingegeben und wenn die Datei nicht existiert, wird die Ausführung des Programms gestoppt. Dies wird im folgenden Bild demonstriert:
Wenn unsere Datei existiert, wird die Funktion sfile(n) aufgerufen, in der wir den Namen der Datei übergeben haben. Innerhalb der Funktion haben wir zuerst den Stat-Systemaufruf verwendet. Wenn stat() -1 zurückgibt, muss ein Fehler auftreten, damit eine Nachricht ausgegeben und die Ausführung des Programms gestoppt wird.
Dann haben wir in der printf-Anweisung den Namen der Funktion und das Punkttrennzeichen verwendet, um auf die Datenelemente von zuzugreifen Statistikstruktur .
Dann haben wir für den Dateimodus auf die Makros oder Flags von st_mode zugegriffen. Hier wird logisch und Operator verwendet, um die jeweiligen Modi zu drucken. Wir haben die Berechtigungen für Benutzer, Gruppe und andere für die angegebene Datei (vom Benutzer eingegebener Dateiname) überprüft.
Damit können Sie sehen, wie Sie den Systemaufruf stat aus der Programmiersprache C verwenden, um Informationen über Dateien vom Betriebssystemkernel zu erhalten. Wenn Sie eine Frage haben, teilen Sie uns dies gerne über den Kommentarbereich mit.