Galileo Computing < openbook >
Galileo Computing - Bücher zur Programmierung und Softwareentwicklung
Galileo Computing - Bücher zur Programmierung und Softwareentwicklung


'Wie werde ich Unix-Guru' als Buch bestellen
A. Willemer
Wie werde ich UNIX-Guru
I  ANWENDUNG
Know-How für Unix/Linux-User: Einführung, Shell, Befehle, Hilfe, Arbeit mit Dateien, Editoren, Reguläre Ausdrücke, nützliche Tools, Hardware.

II  ADMINISTRATION
Tools, Systemstart, Benutzer verwalten, Hardware konfigurieren, Software installieren, Datensicherung, Tuning, Kernel

III  NETZWERK
Client/Server Systeme, TCP/IP, Routing, IPv6, Internet-Dienste, DHCP, Webserver, Firewalls

IV  DAS X-WINDOW SYSTEM
Die grafische Oberfläche von UNIX einrichten und nutzen

V  PROGRAMMIERUNG VON SHELLSKRIPTEN
Automatisieren von Tasks durch Shell-Skripte.

VI  PERL
Interpreter, Syntax, Variablen, Steuerung, Funktionen, UNIX-Aufrufe, GUIs mit Tk

VII  PROGRAMMIERWERKZEUGE
C-Compiler, Analyse-Tools, CVS, yacc, diff

VIII  UNIX-SYSTEMAUFRUFE
UNIX-Befehle in eigenen Programmen nutzen

IX  LITERATUR
Weiterführende Literatur zu UNIX und LINUX

 
Galileo Computing / <openbook> / "Wie werde ich UNIX-Guru ?"
« Dateihandle duplizieren: dup Dateizugriffe Dateieigenschaften ändern »

Unterabschnitte
  • stat() und fstat()
  • Zugriffsrecht ermitteln

Dateieigenschaften ermitteln

Sie können aus dem Programm heraus ermitteln, wie die Zugriffsrechte auf eine Datei sind. Sie erhalten Informationen über Zeiten des letzten Schreibens und Lesens. Sie können den Besitzer und den Typ der Datei feststellen.

stat() und fstat()

Mit der Funktion stat() und fstat() können Sie Informationen über eine Datei ermitteln. Die Ergebnisse werden in einer Struktur vom Typ stat abgelegt. Strukturen sind zusammengesetzte Typen. Sie müssen eine Variable diesen Typs anlegen und dessen Adresse der Funktion stat() übergeben. Der Unterschied zwischen beiden Funktionen liegt darin, dass stat() den Dateinamen und fstat() das Dateihandle zur Identifikation der Datei verwendet.

#include <sys/types.h>
#include <sys/stat.h>
int  stat(char *dateiname,   struct stat *puffer);
int fstat(int   dateihandle, struct stat *puffer); 

Die Ergebnisse finden sich in der Variablen von Typ stat, auf die der Parameter puffer zeigt. Die Definition der Struktur stat lautet:

struct stat {
  dev_t  st_dev     /* (P) Device, auf dem die Datei liegt */
  ushort st_ino     /* (P) Inode-Nummer */
  ushort st_mode    /* (P) Dateityp  */
  short  st_nlink   /* (P) Anzahl der Links der Datei  */
  ushort st_uid     /* (P) Eigner-ID (uid)  */
  ushort st_gid     /* (P) Gruppen-ID (gid)  */
  dev_t  st_rdev    /* Major- und Minornumber, falls Device */
  off_t  st_size    /* (P) Größe in Byte  */
  time_t st_atime   /* (P) Zeitpunkt letzter Zugriffs  */
  time_t st_mtime   /* (P) Zeitpunkt letzte Änderung  */
  time_t st_ctime   /* (P) Zeitpunkt letzte Statusänderung */
};

Die Bestandteile dieser Struktur können sich je nach System unterscheiden. Die mit (P) gekennzeichneten Elemente sind aber zwingend von POSIX vorgeschrieben.

st_dev und st_ino beschreiben eindeutig den Ort einer Datei. st_dev ist das Device, bei Festplatten also die Partition. st_ino bezeichnet den i-node, in dem auf die Datei verwiesen wird.

Die rechten 12 Bit von st_mode beschreiben die Rechtezuordnung der Datei, wie sie von chmod (siehe S. chmod) bekannt ist. Zu berücksichtigen ist, dass die Werte oktal sind, Der Modus 755 muss also als 0755 in einem C-Programm dargestellt werden. In den nächsten vier Bit wird kodiert, welchen Typ die Datei hat. Um beides zu trennen, gibt es die Konstante S_IFMT. Mit ihr können Sie eine Maske über diese Bits setzen. Anschließend können Sie den Wert mit folgenden Konstanten vergleichen:

[Konstanten für den Dateityp]L|L Konstante & Dateityp
S_IFSOCK & Sockets
S_IFLNK & Symbolische Links
S_IFREG & reguläre Dateien
S_IFBLK & Block-Devices
S_IFDIR & Verzeichnisse
S_IFCHR & Char-Devices
S_IFIFO & FIFOs

Das folgende Beispielprogramm ermittelt für die als ersten Parameter übergebene Dateinamen die Rechte und stellt anschließend fest, ob es sich um eine Datei, einen symbolischen Link oder ein Verzeichnis handelt.

[Dateityp und Rechte bestimmen]
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc, char **argv)
{
struct stat Status;
int Dateityp;

stat(argv[1], &Status);
   /* Dateirechte */
   printf("Dateirechte: %o n", Status.st_mode & S_IFMT);
   Dateityp = Status.st_mode & S_IFMT;
   switch (Dateityp) {
     case S_IFREG: puts("Datei"); break;
     case S_IFLNK: puts("Symbolischer Link"); break;
     case S_IFDIR: puts("Verzeichnis"); break;
     default: puts("Sonstiges");
   }
}

In st_nlink steht, wieviele harte Links auf die Datei zeigen.

Mit st_uid und st_gid werden der Besitzer und die Besitzergruppe ermittelt. Der Wert ist eine Zahl, nämlich die, welche in /etc/passwd bzw. in /etc/group festgelegt wird.

In st_rdev ist die Major- und Minornummer kodiert, sofern es sich bei der Datei um ein Device handelt.

Sofern es sich bei der Datei um eine reguläre Datei handelt, finden Sie in st_size die Größe in Bytes.

Jeder lesende oder schreibende Zugriff auf die Datei aktualisiert den Wert st_atime. Jede Veränderung des Dateiinhalts wird in in st_mtime notiert. Der Zeitpunkt der Änderungen bezüglich der Benutzer, Rechte, Linkzahl oder ähnlichem, also allem, was nicht den Inhalt betrifft, wird in st_ctime festgehalten.

Zugriffsrecht ermitteln

Will ein Programm ermitteln, ob es beispielsweise Schreibrecht auf eine Datei hat, könnte es mit stat alle Informationen über die Datei auswerten. Schneller geht es mit der Funktion access(), die nur ermittelt, ob das gewünschte Recht verfügbar ist.

#include <unistd.h>
int access(const char *dateiname, int modus);

An den Parameter modus können folgende Konstanten übergeben werden:

[Rechte beim Aufruf von access]L|L Konstante & Bedeutung
F_OK & Prüfung auf Existenz der Datei
R_OK & Prozess darf lesen
W_OK & Prozess darf schreiben
X_OK & Prozess darf die Datei ausführen

Der Rückgabewert ist 0, wenn der Zugriff erlaubt ist oder EACCESS, wenn nicht.



« Dateihandle duplizieren: dup | Dateizugriffe | Dateieigenschaften ändern »
 
 Zum Katalog
Zum Katalog
Wie werde ich UNIX-Guru?
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 UNIX/Linux

PHP 4-Workshop

Einstieg in Python

Perl fürs Web

MySQL 4

GNOME 2.0
 Empfehlung

Einstieg in XML
 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
Info

 MyGalileo
Der Service für registrierte Leser:
Zu MyGalileo
Info



Copyright © Galileo Press GmbH 2003
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.
[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de