Come posso convertire un puntatore di file (FILE * fp) in un descrittore di file (int fd)?


174

Ho un FILE *, restituito da una chiamata a fopen(). Ho bisogno di ottenere un descrittore di file da esso, per effettuare chiamate come fsync(fd)su di esso. Qual è la funzione per ottenere un descrittore di file da un puntatore a file?


Oppure potresti aprire il file con open (2) e avresti un descrittore di file dall'inizio
Antoine Pelisse,

Risposte:


214

La funzione corretta è int fileno(FILE *stream). Può essere trovato in <stdio.h>, ed è uno standard POSIX ma non standard C.


4
A rigor di termini, non ci sarebbe alcuna necessità di menzionare intestazioni o librerie se la funzione fosse effettivamente parte della libreria C standard. Tuttavia, non è standard, motivo per cui potrebbe avere senso menzionare almeno l'intestazione.
An

20
L'accesso alle funzioni nella libreria C standard richiede l'inclusione di intestazioni, almeno se il compilatore si aspetta prototipi (non ricordo mai quale sia effettivamente il comportamento standard a tale riguardo). Senza intestazioni, nessun nome è definito all'inizio di un file C.
Phil Miller,

1
@Novelocrat: non intendevo dire che non c'è bisogno di #includenulla. Volevo solo dire che è sempre facile trovare il nome dell'intestazione corretta per una funzione standard . Vale a dire non è molto importante menzionare il nome esatto dell'intestazione nella risposta.
AnT

9
Questa è una buona risposta, ma vale la pena notare che questa non è una funzione c standard, è una funzione posix.
Evan Teran,

6
Non è nello standard C, perché i descrittori di file sono una cosa UNIX (su Linux, è aperto (2), non aperto (3)).
non utente

42

Anche se fileno(FILE *)può restituire un descrittore di file, fai MOLTO attenzione a non bypassare il buffer di stdio. Se sono presenti dati buffer (in lettura o in scrittura senza scrittura), le letture / scritture dal descrittore di file potrebbero fornire risultati imprevisti.

Per rispondere a una delle domande secondarie, per convertire un descrittore di file in un puntatore FILE, utilizzare fdopen(3)


1
Non credo che questo sia stato utile per le persone che lo cercano specificamente, e questo è già stato risposto nella sezione commenti del post di OP un mese prima che questo fosse scritto. Questo è più di un chiarimento logico rispetto alle informazioni reali.
Kev

4
I commenti che sono così importanti devono essere sollevati come risposte. Un'enorme percentuale di commenti sono metacommenti snarky, inutili come i tuoi ... e questo;)
Mark Gerolimatos,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.