mkstemp, mkostemp, mkstemps, mkostemps - eine einzigartige temporäre
Datei erstellen
Standard-C-Bibliothek (
libc,
-lc)
#include <stdlib.h>
int mkstemp(char *schablone);
int mkostemp(char *schablone, int schalter);
int mkstemps(char *schablone, int endungslaenge);
int mkostemps(char *schablone, int endungslaenge, int schalter);
mkstemp():
_XOPEN_SOURCE >= 500
|| /* Glibc >= 2.12: */ _POSIX_C_SOURCE >= 200809L
|| /* Glibc <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE
mkostemp():
_GNU_SOURCE
mkstemps():
/* Glibc >= 2.19: */ _DEFAULT_SOURCE
|| /* Glibc <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE
mkostemps():
_GNU_SOURCE
Die Funktion
mkstemp() erstellt einen eindeutigen temporären
Dateinamen aus
schablone, erstellt und öffnet die Datei und gibt
einen Deskriptor für für die offene Datei zurück.
Die letzten sechs Zeichen von
schablone müssen
»XXXXXX« sein. Diese werden durch eine Zeichenkette ersetzt, die
den Dateinamen eindeutig macht. Da sie verändert wird, darf
schablone keine Zeichenkettenkonstante sein, sondern als Zeichenfeld
deklariert werden.
Diese Datei wird mit den Rechten 0600 erstellt, das heißt, nur der
Besitzer darf sie lesen und schreiben. Der zurückgegebene
Dateideskriptor ist zum Lesen und Schreiben geöffnet. Die Datei wird
mit
open(2) und dem Schalter
O_EXCL geöffnet, was
gewährleistet, dass die Datei vom aufrufenden Prozess erzeugt wurde.
Die Funktion
mkostemp() ist
mkstemp() ähnlich, mit dem
Unterschied, dass die folgenden Bits – mit der selben Bedeutung wie
für
open(2) – in
schalter angegeben werden
können:
O_APPEND,
O_CLOEXEC und
O_SYNC. Beachten
Sie, dass
mkostemp() beim Erstellen der Datei bereits die Werte
O_RDWR,
O_CREAT und
O_EXCL im Argument
schalter
beinhaltet, das an
open(2) übergeben wird. Es ist nicht
nötig, diese Werte in das Argument
schalter einzubeziehen und
ruft auf einigen System Fehler hervor.
Die Funktion
mkstemps() unterscheidet sich von
mkstemp() nur
dadurch, dass die Zeichenkette in
schablone eine Endung von
endungslaenge Zeichen enthält. Daher hat
schablone die
Form
praefixXXXXXXendung und die Zeichenkette XXXXXX wird wie
für
mkstemp() verändert.
Die Funktion
mkostemp() verhält sich zu
mkstemps() wie
mkostemp() zu
mkstemp().
Bei Erfolg geben diese Funktionen den Dateideskriptor der temporären
Datei zurück. Im Fehlerfall wird -1 zurückgegeben und
errno gesetzt, um den Fehler anzuzeigen.
- EEXIST
- Es konnte kein eindeutiger temporärer Dateiname
erstellt werden. Der Inhalt von schablone ist nun undefiniert.
- EINVAL
- Für mkstemp() und mkostemp(): Die
letzten sechs Buchstaben von schablone waren nicht
XXXXXX;schablone ist unverändert.
- Für mkstemps() und mkostemps():
schablone ist weniger als (6 + endungslaenge) Zeichen lang
oder die letzten 6 Zeichen vor der Endung in schablone waren nicht
XXXXXX.
Diese Funktionen könnten auch mit einem der für
open(2)
beschriebenen Fehler fehlschlagen.
mkostemp() ist seit Glibc 2.7 verfügbar.
mkstemps() und
mkostemps() sind seit Glibc 2.11 verfügbar.
Siehe
attributes(7) für eine Erläuterung der in diesem
Abschnitt verwandten Ausdrücke.
Schnittstelle |
Attribut |
Wert |
mkstemp(), mkostemp(), mkstemps(),
mkostemps() |
Multithread-Fähigkeit |
MT-Safe |
mkstemp(): 4.3BSD, POSIX.1-2001.
mkstemps(): nicht standardisiert, erscheint aber auf mehreren anderen
Systemen
mkostemp() und
mkostemps() sind Glibc-Erweiterungen.
In den Glibc-Versionen bis einschließlich 2.06 wurde die Datei mit den
Rechten 0666 erstellt, das heißt, alle Benutzer dürfen sie lesen
und schreiben. Dieses frühere Verhalten könnte ein
Sicherheitsrisiko darstellen, besonders seit andere UNIX-Varianten 0600
benutzen und jemand diese Einzelheit bei der Portierung von Programmen
übersehen könnte. POSIX.1-2008 fügt eine Anforderung
hinzu, dass die Datei mit dem Modus 0600 erstellt wird.
Allgemeiner ausgedrückt, sagt die POSIX-Spezifikation von
mkstemp() nichts über die Dateimodi, daher sollte die Anwendung
sicherstellen, dass ihre Dateimodus-Erstellungsmaske (siehe
umask(2))
vor dem Aufruf von
mkstemp() (und
mkostemp()) entsprechend
gesetzt ist.
mkdtemp(3),
mktemp(3),
tempnam(3),
tmpfile(3),
tmpnam(3)
Die deutsche Übersetzung dieser Handbuchseite wurde von Andreas D.
Preissig <
[email protected]>, Chris Leick
<
[email protected]>, Mario Blättermann
<
[email protected]> und Dr. Tobias Quathamer
<
[email protected]> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
GNU
General Public License Version 3 oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an die
Mailingliste
der Übersetzer