Frage

Mit dem fdopen() Verwendung fileno() ist es möglich, Ströme mit vorhandenen Dateibeschreibungen zu öffnen. Doch der richtige Weg, um eine Datei zu schließen, wenn Sie es mit einem Strom geöffnet haben, ist die fclose() Zeiger auf FILE. Wie kann man den Stream schließen, aber die offene Dateideskriptor behalten?

Dieses Verhalten ist verwandt mit fflush() aufrufen und dann fileno(), und dann nie wieder den FILE Zeiger, mit der Ausnahme abschließend. Eine weitere Sorge ist, dass, wenn Sie dann wieder fdopen(), gibt es nun mehrere FILE Zeiger, und Sie können nur in der Nähe einer von ihnen.

War es hilfreich?

Lösung

Wenn Sie auf einem POSIXy System sind (was ich nehme an, Sie sind, da Sie fileno() haben), können Sie a href verwenden <= "http://linux.die.net/man/2/dup" rel = "noreferrer"> dup() den Dateideskriptor zu klonen:

int newfd = dup(fileno(stream));
fclose(stream);

Sie können auch eine doppelte Dateideskriptors Hand fdopen():

FILE *stream = fdopen(dup(fd), "r");

In beiden Fällen wird die andere Kopie des fd nicht mit dem FILE * schließen. Aber denken Sie daran, den Standort Zeiger ist gemeinsam, also seien Sie vorsichtig, wenn Sie beide zur gleichen Zeit verwenden. Außerdem werden alle fcntl() Schlösser auf dem Original fd gehalten wird freigegeben werden, wenn Sie die Kopie zu schließen.

Andere Tipps

Wenn alles andere fehlschlägt, dup (2) könnte helfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top