Come ottenere un puntatore FILE da un descrittore di file?


Risposte:


103

Usa fdopen():


34
E per ottenere il descrittore di file da un FILE * usa fileno(): linux.die.net/man/3/fileno
Lee Netherton

2
se è fdstato aperto con alcune bandiere (come O_NONBLOCK) - cosa succederà con loro dopo fdopenaverlo aperto con nuove bandiere? Verranno xoruniti o sostituiti?
xealits

5
@jww: i descrittori di file non sono ANSI C per cominciare.
Rufflewind

2
è male in qualche modo chiamare fdopenpiù volte? (supponendo che avvenga all'interno di una funzione che viene chiamata più e più volte)
phil294

2
@xealits Le opzioni per il FILE * devono rientrare nell'ambito del descrittore di file già aperto. Quindi, se hai aperto fd in sola lettura e FILE * in sola scrittura, dovrebbe generare un'eccezione. Per maggiori informazioni, fare riferimento a ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
Tjad Clark

28

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

man fdopen output:

SINOSSI

La fdopen()funzione di associa un ruscello con il descrittore di file esistente, fildes. La modalità del flusso deve essere compatibile con la modalità del descrittore di file. Quando il flusso è chiuso via fclose(3), fildesviene chiuso anche.


1
Non disponibile in ANSI C.
jww

Per maggiore chiarezza, fare riferimento a ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
Tjad Clark

-8

Non esiste un modo standard per farlo (o il contrario) poiché lo standard C non ha nulla da dire sui descrittori di file. La tua piattaforma specifica può o non può fornire tale meccanismo.


17
Dipende da cosa intendi per "standard". POSIX è uno standard.
Richard Pennington,

12
La domanda riguardava i descrittori di file. ;-)
Richard Pennington

11
@ Neil> la domanda contrassegnata come C non significa "dimmi la verità sull'agrifoglio sullo standard C" ma piuttosto "Sto codificando in C, non riesco a farlo, per favore dimmi se è possibile e come? "
Gregory Pakosz,

8
Sono d'accordo che non esiste un modo standard per farlo, ma la menzione del PO mkstempimplica che le soluzioni non standard siano accettabili in questo caso particolare. In quel caso, tuttavia, avrebbe dovuto aggiungere il posixtag (che vedo è stato aggiunto da allora).
Emerick Rogul

9
@ Neil, e lo scopo della Rete e il significato della vita. Avresti più senso se dicessi che hai un'opinione diversa. Dubito anche che SO sia tutta una questione di spaccare i capelli sugli standard. E non è molto pratico fare affidamento sulle capacità di tagging di qualcuno con un'esperienza SO corrispondente alla reputazione di 23.
Michael Krelin - hacker
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.