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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top