Como converter um ponteiro de arquivo (FILE * fp) em um descritor de arquivo (int fd)?

174

Eu tenho um FILE *, retornado por uma ligação para fopen(). Preciso obter um descritor de arquivo, para fazer chamadas semelhantes fsync(fd). Qual é a função para obter um descritor de arquivo de um ponteiro de arquivo?

Phil Miller
fonte
Ou você pode abrir o arquivo com open (2), e gostaria de ter um descritor de arquivo desde o início
Antoine Pelisse

Respostas:

214

A função adequada é int fileno(FILE *stream). Ele pode ser encontrado em <stdio.h>e é um padrão POSIX, mas não o padrão C.

Phil Miller
fonte
4
Estritamente falando, não haveria necessidade de mencionar cabeçalhos ou bibliotecas se a função realmente fizesse parte da biblioteca C padrão. No entanto, não é padrão, e é por isso que pode fazer sentido mencionar pelo menos o cabeçalho.
AnT
20
O acesso a funções na biblioteca C padrão exige a inclusão de cabeçalhos, pelo menos se o seu compilador espera protótipos (nunca me lembro qual é o comportamento padrão a esse respeito). Sem cabeçalhos, nenhum nome é definido no início de um arquivo C.
Phil Miller
1
@Novelocrat: Eu não quis dizer que não há necessidade de #includenada. Apenas quis dizer que é sempre fácil encontrar o nome do cabeçalho apropriado para uma função padrão . Ou seja, não é realmente crítico mencionar o nome exato do cabeçalho na resposta.
AnT
9
Esta é uma boa resposta, mas vale a pena notar que essa não é uma função c padrão, é uma função posix.
Evan Teran
6
Não está no padrão C, porque os descritores de arquivo são coisa do UNIX (no Linux, é aberto (2), não é aberto (3)).
não usuário
42

Mesmo que fileno(FILE *)possa retornar um descritor de arquivo, tenha MUITO cuidado para não ignorar o buffer do stdio. Se houver dados de buffer (gravação lida ou não liberada), as leituras / gravações do descritor de arquivo poderão fornecer resultados inesperados.

Para responder a uma das perguntas secundárias, para converter um descritor de arquivo em um ponteiro FILE, use fdopen(3)

Mark Gerolimatos
fonte
1
Eu não acredito que isso tenha sido útil para as pessoas que pesquisam isso especificamente, e isso já foi respondido na seção de comentários da postagem do OP um mês antes de isso ser escrito. Isso é mais um esclarecimento lógico do que informações reais.
kevr
4
Comentários tão importantes que precisam ser levantados como respostas. Uma grande porcentagem dos comentários são snarky, metacomments inúteis como a sua ... e este;)
Mark Gerolimatos