Stat System Call Linux Tutorial

Stat System Call Linux Tutorial



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:

  1. st_dev: Es ist die ID des Geräts, auf dem sich unsere Datei derzeit befindet.
  2. st_rdev: Dieses Feld beschreibt, dass eine bestimmte Datei ein bestimmtes Gerät repräsentiert.
  3. 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
  4. st_größe: st_size ist die Größe der Datei in Bytes.
  5. st_atime: Dies ist der letzte oder letzte Zeitpunkt, zu dem auf die Datei zugegriffen wurde.
  6. st_ctime: Dies ist der letzte Zeitpunkt, zu dem der Status oder die Berechtigungen der Datei geändert wurden.
  7. st_mtime: Dies ist der Zeitpunkt, zu dem die Datei zuletzt geändert wurde.
  8. st_blksize: Dieses Feld gibt die bevorzugte Blockgröße für das E/A-Dateisystem an, die von Datei zu Datei variieren kann.
  9. st_blocks: Dieses Feld gibt die Gesamtanzahl der Blöcke in Vielfachen von 512 Byte an.
  10. st_nlink: Dieses Feld gibt die Gesamtzahl der Hardlinks an.
  11. st_uid: Dieses Feld gibt die Benutzer-ID an.
  12. st_gid: Dieses Feld gibt die Gruppen-ID an.
  13. 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.