Chiudi un puntatore FILE senza chiudere il descrittore di file sottostante
Domanda
Usando fdopen ()
, fileno ()
è possibile aprire flussi con descrittori di file esistenti. Tuttavia, il modo corretto di chiudere un file, una volta aperto con uno stream, è fclose ()
il puntatore FILE
. Come si può chiudere il flusso, ma conservare il descrittore di file aperto?
Questo comportamento è simile a chiamare fflush ()
e quindi fileno ()
, e quindi non utilizzare mai più il puntatore FILE
, tranne in chiusura. Un'ulteriore preoccupazione è che se poi fdopen ()
, ora ci sono più puntatori FILE
e puoi chiuderne solo uno.
Soluzione
Se sei su un sistema POSIXy (che presumo tu sia, dato che hai fileno ()
), puoi usare dup ()
per clonare il descrittore di file:
int newfd = dup(fileno(stream));
fclose(stream);
Oppure puoi consegnare a fdopen ()
un descrittore di file duplicato:
FILE *stream = fdopen(dup(fd), "r");
Ad ogni modo, l'altra copia del file fd non si chiuderà con FILE *
. Tuttavia, tieni presente che il puntatore di posizione è condiviso, quindi fai attenzione se stai utilizzando entrambi contemporaneamente. Inoltre, tutti i blocchi fcntl ()
presenti sul file fd originale verranno rilasciati alla chiusura della copia.
Altri suggerimenti
Se tutto il resto fallisce, dup (2) potrebbe aiutare.