tmpfile, tmpfile_s
| Definiert in Header <stdio.h> |
||
| FILE* tmpfile( void ); |
(1) | |
| errno_t tmpfile_s( FILE* restrict* restrict streamptr ); |
(2) | (seit C11) |
- Wie bei allen grenzgeprüften Funktionen ist
tmpfile_snur garantiert verfügbar, wenn __STDC_LIB_EXT1__ von der Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ vor dem Einbinden von <stdio.h> auf die Ganzzahlkonstante 1 setzt.
Die von dieser Funktion erstellte temporäre Datei wird beim normalen Beenden des Programms geschlossen und gelöscht. Ob sie bei abnormaler Beendigung gelöscht wird, ist implementierungsabhängig.
Inhalt |
[bearbeiten] Parameter
[bearbeiten] Rückgabewert
[bearbeiten] Anmerkungen
Auf einigen Implementierungen (z. B. ältere Linux-Versionen) erstellt diese Funktion tatsächlich eine temporäre Datei, öffnet sie und löscht sie sofort aus dem Dateisystem: Solange ein offener Dateideskriptor für eine gelöschte Datei von einem Programm gehalten wird, existiert die Datei, aber da sie gelöscht wurde, erscheint ihr Name nicht in einem Verzeichnis, so dass kein anderes Prozess sie öffnen kann. Sobald der Dateideskriptor geschlossen wird oder das Programm beendet wird (normal oder abnormal), wird der von der Datei belegte Speicherplatz vom Dateisystem freigegeben. Neuere Linux-Versionen (seit 3.11 oder später, je nach Dateisystem) erstellen solche unsichtbaren temporären Dateien in einem Schritt über ein spezielles Flag im open()-Systemaufruf.
Auf einigen Implementierungen (z. B. Windows) sind erhöhte Berechtigungen erforderlich, da die Funktion die temporäre Datei möglicherweise in einem Systemverzeichnis erstellt.
[bearbeiten] Beispiel
#define _POSIX_C_SOURCE 200112L #include <stdio.h> #include <unistd.h> int main(void) { printf("TMP_MAX = %d, FOPEN_MAX = %d\n", TMP_MAX, FOPEN_MAX); FILE* tmpf = tmpfile(); fputs("Hello, world", tmpf); rewind(tmpf); char buf[6]; fgets(buf, sizeof buf, tmpf); printf("got back from the file: '%s'\n", buf); // Linux-specific method to display the tmpfile name char fname[FILENAME_MAX], link[FILENAME_MAX] = {0}; sprintf(fname, "/proc/self/fd/%d", fileno(tmpf)); if (readlink(fname, link, sizeof link - 1) > 0) printf("File name: %s\n", link); }
Mögliche Ausgabe
TMP_MAX = 238328, FOPEN_MAX = 16 got back from the file: 'Hello' File name: /tmp/tmpfjptPe5 (deleted)
[bearbeiten] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- 7.21.4.3 Die Funktion tmpfile (p: TBD)
- K.3.5.1.1 Die Funktion tmpfile_s (p: TBD)
- C17-Standard (ISO/IEC 9899:2018)
- 7.21.4.3 Die Funktion tmpfile (p: 222)
- K.3.5.1.1 Die Funktion tmpfile_s (p: 427)
- C11-Standard (ISO/IEC 9899:2011)
- 7.21.4.3 Die Funktion tmpfile (p: 303)
- K.3.5.1.1 Die Funktion tmpfile_s (p: 586-587)
- C99-Standard (ISO/IEC 9899:1999)
- 7.19.4.3 Die Funktion tmpfile (p: 269)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 4.9.4.3 Die Funktion tmpfile
[bearbeiten] Siehe auch
| (C11) |
gibt einen eindeutigen Dateinamen zurück (Funktion) |
| C++ Dokumentation für tmpfile
| |