mkdir() aus sys/stat.h verwenden
Problem:
Du möchtest die Funktion mkdir() aus dem POSIX-Header sys/stat.h verwenden, weißt aber nicht, wie das mode_t-Argument aussehen soll.
Lösung
Eine detaillierte Referenz findest du auf der Opengroup-Seite zu mkdir
Das erste Argument sollte offensichtlich sein – gib einfach den Pfadnamen des Verzeichnisses ein, das du erstellen möchtest. Wenn du einen std::string (in C++) verwendest, nutze die Member-Funktion c_str(), um einen C-String zu erhalten.
Das zweite Argument definiert die Berechtigungen, die das neu erstellte Verzeichnis haben soll. Diese Anleitung setzt voraus, dass du mit Unix-Dateiberechtigungen vertraut bist. Wenn nicht, lies bitte die entsprechende Wikipedia-Seite.
Entscheide zuerst, welche Rechte das Verzeichnis haben soll. Das läuft auf diese 9 Fragen hinaus:
- Soll der Besitzer lesen/schreiben/ausführen können?
- Soll die Gruppe lesen/schreiben/ausführen können?
- Soll jeder andere (= others) lesen/schreiben/ausführen können? Das zweite Argument hat den Typ
mode_t, aber das ist im Wesentlichen nur ein Alias für einen Integer-Typ.
sys/stat.h stellt mehrere Integer-Werte zur Verfügung, die man bitweise ODER (|) verknüpfen kann, um den mode_t zu erstellen:
- Benutzer:
S_IRUSR(lesen),S_IWUSR(schreiben),S_IXUSR(ausführen) - Gruppe:
S_IRGRP(lesen),S_IWGRP(schreiben),S_IXGRP(ausführen) - Andere:
S_IROTH(lesen),S_IWOTH(schreiben),S_IXOTH(ausführen)
Zusätzlich werden einige Abkürzungen bereitgestellt (im Wesentlichen eine bitweise-ODER-Kombination der obigen):
- Lesen + Schreiben + Ausführen:
S_IRWXU(Benutzer),S_IRWXG(Gruppe),S_IRWXO(Andere) DEFFILEMODE: Entspricht 0666 = rw-rw-rw-ACCESSPERMS: Entspricht 0777 = rwxrwxrwx Um dem Benutzer nur rwx (lesen+schreiben+ausführen) Rechte zu geben, während Gruppenmitglieder und andere nichts tun dürfen, kann man einen der folgendenmkdir()-Aufrufe äquivalent verwenden:
mkdir("mydir", S_IRUSR | S_IWUSR | S_IXUSR);
mkdir("mydir", S_IRWXU);Um allen alle Rechte zu gewähren (Modus 0777 = rwxrwxrwx), kann man einen der folgenden Aufrufe äquivalent verwenden:
mkdir("mydir", S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH);cat > mini.config << 'EOF' &&
CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_BINFMT_ELF=y
CONFIG_HOSTFS=y
CONFIG_LBD=y
CONFIG_BLK_DEV=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_STDERR_CONSOLE=y
CONFIG_UNIX98_PTYS=y
CONFIG_EXT2_FS=y
CONFIG_MODULES=y
CONFIG_INOTIFY_USER=y
CONFIG_NET=y
CONFIG_UNIX=y
CONFIG_EXT3_FS=m
CONFIG_EXT4_FS=m
EOF
make ARCH=um allnoconfig KCONFIG_ALLCONFIG=mini.config
make ARCH=um -j4 all modules