Como obter um ponteiro FILE de um descritor de arquivo?

Respostas:

103

Use fdopen():

Richard Pennington
fonte
34
E para obter o descritor de arquivo de um FILE * use fileno(): linux.die.net/man/3/fileno
Lee Netherton
2
se fdfoi aberto com alguns sinalizadores (como O_NONBLOCK) - o que acontecerá com eles depois de fdopenabrir com novos sinalizadores? Eles ficarão xorjuntos ou serão substituídos?
xealits
5
@jww: Para começar, os descritores de arquivo não são ANSI C.
Rufflewind
2
é ruim ligar fdopenvárias vezes? (supondo que aconteça dentro de alguma função que é chamada repetidamente)
phil294
2
@xealits As opções para o ARQUIVO * devem estar dentro do escopo do descritor de arquivo já aberto. Portanto, se você abriu fd com somente leitura e FILE * somente com gravação, ele deve lançar uma exceção. Para obter mais informações, consulte ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
Tjad Clark
28

FILE* f = fdopen(d, "w");

saída man fdopen:

SINOPSE

A fdopen()função associa um fluxo ao descritor de arquivo existente fildes,. O modo do fluxo deve ser compatível com o modo do descritor de arquivo. Quando o fluxo é fechado via fclose(3), fildestambém é fechado.

Gregory Pakosz
fonte
1
Não disponível em ANSI C.
jww
Para obter mais clareza, consulte ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
Tjad Clark
-8

Não existe uma maneira padrão de fazer isso (ou o contrário), pois o padrão C não tem nada a dizer sobre os descritores de arquivo. Sua plataforma específica pode ou não fornecer esse mecanismo.


fonte
17
Depende do que você entende por "padrão". POSIX é um padrão.
Richard Pennington
12
A pergunta era sobre descritores de arquivo. ;-)
Richard Pennington
11
@ Neil> a questão sendo marcada como C não significa "diga-me a verdade sobre o padrão C", mas sim "Estou codificando em C, não consigo fazer isso, diga-me se é possível e como? "
Gregory Pakosz
8
Concordo que não há uma maneira padrão de fazer isso, mas a menção do OP a mkstempimplica que soluções não padrão são aceitáveis ​​neste caso específico. Nesse caso, no entanto, ele deveria ter adicionado a posixtag (que vejo que já foi adicionada).
Emerick Rogul
9
@Neil, e o propósito da Internet e o significado da vida. Você faria mais sentido se dissesse que tem opiniões diferentes. Eu também duvido que SO seja tudo sobre divisão de padrões. E não é muito prático confiar nas habilidades de marcação de alguém com uma experiência de SO correspondente à reputação de 23.
Michael Krelin - hacker