Pergunta

Ao usar fdopen(), fileno() é possível correntes abertas com descritores de arquivos existentes. No entanto, a maneira correta de fechar um arquivo, uma vez que você abriu com um fluxo é fclose() o ponteiro FILE. Como se pode fechar o fluxo, mas reter o descritor de arquivo aberto?

Este comportamento é semelhante a chamar fflush() e depois fileno(), e depois nunca usando o ponteiro FILE novamente, exceto no fechamento. Uma preocupação adicional é que se você, em seguida, fdopen() novamente, há agora vários ponteiros FILE, e você pode somente perto um deles.

Foi útil?

Solução

Se você estiver em um sistema POSIXy (que eu suponho que você é, desde que você tem fileno()), você pode usar dup() para clone o descritor de arquivo:

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

Ou você pode entregar fdopen() um descritor de arquivo duplicado:

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

De qualquer maneira, a outra cópia do fd não vai fechar com o FILE *. No entanto, tenha em mente o ponteiro local é compartilhada, por isso tome cuidado se você estiver usando os dois ao mesmo tempo. Além disso, os bloqueios fcntl() realizada no fd originais irá ser liberada quando você fechar a cópia.

Outras dicas

Se tudo mais falhar, dup (2) poderia ajudar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top