Namensräume
Varianten
Aktionen

tmpnam, tmpnam_s

Von cppreference.com
< c‎ | io
 
 
Datei-Ein-/Ausgabe
Typen und Objekte
        
Funktionen
Datei-Zugriff
(C95)
Unformatierte Ein-/Ausgabe
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Formatierte Eingabe
Direkte Ein-/Ausgabe
Formatierte Ausgabe
Dateipositionierung
Fehlerbehandlung
Operationen auf Dateien
tmpnamtmpnam_s
(C11)
 
Definiert in Header <stdio.h>
char *tmpnam( char *filename );
(1)
errno_t tmpnam_s(char *filename_s, rsize_t maxsize);
(2) (seit C11)
#define TMP_MAX        /*nicht spezifiziert*/
#define TMP_MAX_S      /*nicht spezifiziert*/
(seit C11)
#define L_tmpnam       /*nicht spezifiziert*/
#define L_tmpnam_s     /*nicht spezifiziert*/
(seit C11)
1) Erzeugt einen eindeutigen gültigen Dateinamen (nicht länger als L_tmpnam) und speichert ihn in der Zeichenkette, auf die filename zeigt. Die Funktion ist in der Lage, bis zu TMP_MAX eindeutige Dateinamen zu generieren, aber einige oder alle davon könnten im Dateisystem bereits in Gebrauch sein und somit keine geeigneten Rückgabewerte darstellen.
2) Ähnlich wie bei (1), mit der Ausnahme, dass bis zu TMP_MAX_S Namen generiert werden können, die nicht länger als L_tmpnam_s sind. Die folgenden Fehler werden zur Laufzeit erkannt und rufen die aktuell installierte Constraint Handler Funktion auf:
  • filename_s ist ein Nullzeiger
  • maxsize ist größer als RSIZE_MAX
  • maxsize ist kleiner als die generierte Dateinamenszeichenkette
Wie bei allen grenzgeprüften Funktionen ist tmpnam_s nur dann garantiert verfügbar, wenn __STDC_LIB_EXT1__ von der Implementierung definiert wird und wenn der Benutzer __STDC_WANT_LIB_EXT1__ vor dem Einbinden von <stdio.h> auf die ganzzahlige Konstante 1 setzt.

tmpnam und tmpnam_s modifizieren einen statischen Zustand (der zwischen diesen Funktionen geteilt werden kann) und sind nicht zwingend threadsicher.

Inhalt

[bearbeiten] Parameter

filename - Zeiger auf das Zeichenfeld, das mindestens L_tmpnam Bytes aufnehmen kann und als Ergebnisbuffer dient. Wird ein Nullzeiger übergeben, wird ein Zeiger auf einen internen statischen Puffer zurückgegeben.
filename_s - Zeiger auf das Zeichenfeld, das mindestens L_tmpnam_s Bytes aufnehmen kann und als Ergebnisbuffer dient.
maxsize - Maximale Anzahl von Zeichen, die die Funktion schreiben darf (typischerweise die Größe des Arrays filename_s).

[bearbeiten] Rückgabewert

1) filename, wenn filename kein Nullzeiger war. Andernfalls wird ein Zeiger auf einen internen statischen Puffer zurückgegeben. Wenn kein geeigneter Dateiname generiert werden kann, wird ein Nullzeiger zurückgegeben.
2) Gibt Null zurück und schreibt den Dateinamen bei Erfolg nach filename_s. Im Fehlerfall gibt die Funktion einen Wert ungleich Null zurück und schreibt das Nullzeichen nach filename_s[0] (nur wenn filename_s nicht null ist und maxsize nicht null und nicht größer als RSIZE_MAX ist).

[bearbeiten] Hinweise

Obwohl die von tmpnam generierten Namen schwer zu erraten sind, besteht die Möglichkeit, dass eine Datei mit diesem Namen von einem anderen Prozess erstellt wird, zwischen dem Zeitpunkt, an dem tmpnam zurückkehrt, und dem Zeitpunkt, an dem dieses Programm versucht, den zurückgegebenen Namen zum Erstellen einer Datei zu verwenden. Die Standardfunktion tmpfile und die POSIX-Funktion mkstemp haben dieses Problem nicht (das Erstellen eines eindeutigen Verzeichnisses nur mit der Standard-C-Bibliothek erfordert weiterhin die Verwendung von tmpnam).

POSIX-Systeme definieren zusätzlich die ähnlich benannte Funktion tempnam, die die Wahl eines Verzeichnisses bietet (das standardmäßig das optional definierte Makro P_tmpdir ist).

[bearbeiten] Beispiel

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(void)
{
    // Note, the compiler/linker may issue a security warning, e.g. GCC:
    // "warning: the use of `tmpnam' is dangerous, better use `mkstemp'"
    char* name1 = tmpnam(NULL);
    printf("temporary file name: %s\n", name1);
 
    char name2[L_tmpnam];
    if (tmpnam(name2))
        printf("temporary file name: %s\n", name2);
 
    // POSIX offers mkstemp. The following declaration might be
    // necessary as mkstemp is absent in the standard C <stdlib.h>.
    int mkstemp(char*);
 
    char name3[] = "/tmp/fileXXXXXX"; // at least six 'X' required ^_^
    int file_descriptor = mkstemp(name3);
    if (file_descriptor != -1)
        printf("temporary file name: %s\n", name3);
    else
        perror("mkstemp");
}

Mögliche Ausgabe

temporary file name: /tmp/file90dLlR
temporary file name: /tmp/fileY9LWAg
temporary file name: /tmp/filexgv8PF

[bearbeiten] Referenzen

  • C23-Standard (ISO/IEC 9899:2024)
  • 7.21.4.4 The tmpnam function (S: TBD)
  • K.3.5.1.2 The tmpnam_s function (S: TBD)
  • C17-Standard (ISO/IEC 9899:2018)
  • 7.21.4.4 The tmpnam function (S: 222)
  • K.3.5.1.2 The tmpnam_s function (S: 427-428)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.21.4.4 The tmpnam function (S: 303-304)
  • K.3.5.1.2 The tmpnam_s function (S: 587-588)
  • C99-Standard (ISO/IEC 9899:1999)
  • 7.19.4.4 The tmpnam function (S: 269-270)
  • C89/C90-Standard (ISO/IEC 9899:1990)
  • 4.9.4.4 The tmpnam function

[bearbeiten] Siehe auch

gibt einen Zeiger auf eine temporäre Datei zurück
(Funktion) [bearbeiten]
C++ Dokumentation für tmpnam