Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch für Linux, Unix und Windows
– 2., aktualisierte und erweiterte Auflage 2006
Buch: C von A bis Z

C von A bis Z
1.116 S., mit CD, Referenzkarte, 39,90 Euro
Galileo Computing
ISBN 3-89842-643-2
gp Kapitel 19 Attribute von Dateien und Arbeiten mit Verzeichnissen (nicht ANSI C)
  gp 19.1 Attribute einer Datei ermitteln – stat()
    gp 19.1.1 stat() – st_mode
    gp 19.1.2 stat() – st_size
    gp 19.1.3 stat() – st_atime, st_mtime und st_ctime
    gp 19.1.4 stat() – st_gid und st_uid
    gp 19.1.5 stat() – st_nlink, st_ino
    gp 19.1.6 stat() – st_dev, st_rdev
  gp 19.2 Prüfen des Zugriffsrechts – access
  gp 19.3 Verzeichnis-Funktionen
    gp 19.3.1 Verzeichnis erstellen, löschen und wechseln – mkdir, rmdir und chdir
    gp 19.3.2 Wechseln in das Arbeitsverzeichnis – getcwd
    gp 19.3.3 Verzeichnisse öffnen, lesen und schließen – opendir, readdir und closedir


Galileo Computing - Zum Seitenanfang

19.2 Prüfen des Zugriffsrechts – access  toptop

Mit der Funktion access() können Sie feststellen, ob ein Prozess bestimmte Berechtigungen für den Zugriff auf eine Datei hat. Die Syntax zur Funktion access() lautet:

#include <unistd.h>  /* für UNIX/LINUX */
#include <io.h>      /* für MS-DOS     */
int access(const char *pfad, int modus);

So wird überprüft, ob der pfad der Datei existiert und die Zugriffsrechte modus besitzt. Folgende Zugriffsrechte (Modus) existieren:


Tabelle 19.5   Modi zum Prüfen des Zugriffsrechts

modus Bedeutung
00 oder F_OK Datei existiert
01 oder X_OK Datei ausführbar (nur Linux/UNIX)
02 oder W_OK Datei beschreibbar
04 oder R_OK Datei lesbar
06 oder W_OK|R_OK Datei lesbar und beschreibbar

Bei Erfolg gibt diese Funktion den Wert 0 zurück, ansonsten bei Fehler –1. Das folgende Listing überprüft die Zugriffsrechte aller in der Kommandozeile eingegebenen Programme mit der Funktion access():

/* check_access.c */
#ifdef __unix__
    #include <unistd.h>
    #define EXIST F_OK
    #define EXEC  X_OK
    #define WRITE W_OK
    #define READ  R_OK
#else
    #include <io.h>
    #define EXIST 00
    #define EXEC  01
    #define WRITE 02
    #define READ  04
#endif
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
   if(argc == 1) {
      fprintf(stderr, "Mindestens eine Datei angeben!\n");
      return EXIT_FAILURE;
   }
   while(*++argv) {
      printf("%s : \n", *argv);
      /* Existiert die Datei? */
      if(access(*argv, EXIST) != –1) {
         /* Lesen und Schreiben nicht erlaubt */
         if(access(*argv, WRITE|READ) == –1) {
            /* Nur lesen? */
            if(access(*argv, READ) != –1)
               printf("... ist lesbar\n");
            /* Nur schreiben? */
            else if(access(*argv, WRITE) != –1)
               printf("... ist schreibbar\n");
         }
         else
            printf("ist Lesen und schreiben erlaubt\n");
         /* Datei ausführbar? */
         if(access(*argv, EXEC) != –1)
            printf("... ist ausführbar\n");
      }
      else {
         fprintf(stderr, "...existiert nicht\n");
         return EXIT_FAILURE;
      }
   }
   return EXIT_SUCCESS;
}

Zuerst wird überprüft, ob die Datei überhaupt existiert:

if(access(*argv, EXIST) != –1)

Ob die Datei zum Lesen und Schreiben freigegeben ist, wird anschließend mit der folgenden Zeile überprüft:

if(access(*argv, WRITE|READ) != –1)

Trifft dies nicht zu, werden die einzelnen Zugriffsmöglichkeiten getestet:

if(access(*argv, READ) != –1)
   printf("... ist lesbar\n");
else if(access(*argv, WRITE) != –1)
   printf("... ist schreibbar\n");

Die Überprüfung, ob die Datei ausführbar ist

if(access(*argv, EXEC) != –1)

kann bei Windows/MS-DOS entfernt werden, da sie nur unter UNIX/Linux einen Sinn ergibt. In diesem Listing wurden die Konstanten der einzelnen Zugriffsrechte hinter Makros versteckt, damit das Programm möglichst portabel bleibt.

Unter Linux/UNIX werden übrigens nur die ersten drei User-Bits UID überprüft (rwx), also die Zugriffsrechte des Datei-Eigentümers. Es ist auch möglich, access() mit mehreren Konstanten zu verknüpfen:

if( (access(*argv,F_OK|R_OK) ) != –1)
/* if( (access(*argv,00|04) ) != –1) */

Hier wird z.B. ermittelt, ob die Datei existiert und ob für sie Leserechte vorhanden sind.

 << zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z
C von A bis Z
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-Programmierung


Zum Katalog: C/C++






 C/C++


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Reguläre Ausdrücke






 Reguläre Ausdrücke


Zum Katalog: Linux






 Linux


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2006
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, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de