2009-10-21 16 views
12

Utilizzando fdopen(), fileno() è possibile aprire flussi con descrittori di file esistenti. Tuttavia, il modo corretto per chiudere un file, dopo averlo aperto con un flusso è fclose() il puntatore FILE. Come si può chiudere lo stream, ma mantenere il descrittore di file aperto?Chiudere un puntatore FILE senza chiudere il descrittore di file sottostante

Questo comportamento è simile a chiamare fflush() e poi fileno(), e quindi non utilizzare nuovamente il puntatore FILE, tranne che in chiusura. Un'ulteriore preoccupazione è che se si è quindi fdopen() di nuovo, ora ci sono più puntatori FILE e si può solo chiudere uno di loro.

risposta

18

Se siete su un sistema POSIXy (che presumo che sono, visto che hai fileno()), è possibile utilizzare dup() per clonare il file di descrizione:

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

Oppure si può consegnare fdopen() un file duplicato descrittore:

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

in entrambi i casi, l'altra copia del fd non si chiuderà con la FILE *. Tuttavia, tieni presente che il puntatore di posizione è condiviso, quindi fai attenzione se stai utilizzando entrambi allo stesso tempo. Inoltre, eventuali blocchi fcntl() trattenuti nell'originale fd verranno rilasciati quando si chiude la copia.

+0

windows e altre piattaforme supportano fileno()! Non posso credere di non aver pensato a questa dup() soluzione, molto elegante e ovvia –

+0

Non hai nemmeno bisogno di dup2() il nuovo file fd al fd originale e poi close() il nuovo file fd quindi tutto è tornato come prima, ad eccezione del flusso di file chiuso? : D Il che significa che hai bisogno di oldfd = fileno (stream) prima di fclose(). –

+0

Jonathan, il doing do è audace nelle applicazioni multithread. È meglio 'dup' prima di dare il comando fd a' fdopen' in modo da poter essere sicuri che non tocchi mai il tuo originale. – bdonlan

1

Se tutto il resto fallisce, dup (2) potrebbe essere d'aiuto.

Problemi correlati