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?
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)
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;)
Respostas:
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.fonte
#include
nada. 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.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)
fonte