Namespaces
Variants

tmpnam, tmpnam_s

From cppreference.net
< c ‎ | io
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        /*unspecified*/
#define TMP_MAX_S      /*unspecified*/
(seit C11)
#define L_tmpnam       /*unspecified*/
#define L_tmpnam_s     /*unspecified*/
(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 kann bis zu TMP_MAX eindeutige Dateinamen generieren, aber einige oder alle davon könnten im Dateisystem bereits in Verwendung sein und sind daher nicht als Rückgabewerte geeignet.
2) Gleich wie (1) , außer dass bis zu TMP_MAX_S Namen generiert werden können, die nicht länger als L_tmpnam_s sind, und die folgenden Fehler zur Laufzeit erkannt werden und den aktuell installierten constraint handler aufrufen:
  • filename_s ist ein Nullzeiger
  • maxsize ist größer als RSIZE_MAX
  • maxsize ist kleiner als der generierte Dateinamen-String
Wie bei allen bounds-checked Funktionen ist tmpnam_s nur garantiert verfügbar, wenn __STDC_LIB_EXT1__ durch die Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ auf die Integer-Konstante 1 setzt, bevor <stdio.h> eingebunden wird.

tmpnam und tmpnam_s modifizieren statische Zustände (die zwischen diesen Funktionen geteilt werden können) und müssen nicht threadsicher sein.

Inhaltsverzeichnis

Parameter

filename - Zeiger auf das Zeichenarray, das mindestens L_tmpnam Bytes aufnehmen kann, um als Ergebnispuffer verwendet zu werden. Wenn ein Nullzeiger übergeben wird, wird ein Zeiger auf einen internen statischen Puffer zurückgegeben.
filename_s - Zeiger auf das Zeichenarray, das mindestens L_tmpnam_s Bytes aufnehmen kann, um als Ergebnispuffer verwendet zu werden.
maxsize - Maximale Anzahl an Zeichen, die die Funktion schreiben darf (typischerweise die Größe des filename_s Arrays).

Rückgabewert

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

Hinweise

Obwohl die von tmpnam generierten Namen schwer zu erraten sind, ist es möglich, dass eine Datei mit diesem Namen von einem anderen Prozess zwischen dem Zeitpunkt erstellt wird, an dem tmpnam zurückkehrt, und dem Moment, in dem dieses Programm versucht, den zurückgegebenen Namen zu verwenden, um eine Datei zu erstellen. Die Standardfunktion tmpfile und die POSIX-Funktion mkstemp haben dieses Problem nicht (die Erstellung 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 (welches standardmäßig auf den optional definierten Makro P_tmpdir zurückgreift).

Beispiel

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    // Hinweis: Compiler/Linker können eine Sicherheitswarnung ausgeben, z.B. 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 bietet mkstemp. Die folgende Deklaration könnte
    // notwendig sein, da mkstemp in der Standard-C-<stdlib.h> fehlt.
    int mkstemp(char*);
    char name3[] = "/tmp/fileXXXXXX"; // mindestens sechs 'X' erforderlich ^_^
    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

Referenzen

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

Siehe auch

gibt einen Zeiger auf eine temporäre Datei zurück
(Funktion)