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 /*nicht spezifiziert*/ |
||
| #define TMP_MAX_S /*nicht spezifiziert*/ |
(seit C11) | |
| #define L_tmpnam /*nicht spezifiziert*/ |
||
| #define L_tmpnam_s /*nicht spezifiziert*/ |
(seit C11) | |
- 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_snur 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
[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
| (C11) |
gibt einen Zeiger auf eine temporäre Datei zurück (Funktion) |
| C++ Dokumentation für tmpnam
| |