tmpnam, tmpnam_s
|
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) | |
-
- 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_snur 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
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
|
(C11)
|
gibt einen Zeiger auf eine temporäre Datei zurück
(Funktion) |
|
C++ documentation
für
tmpnam
|
|