2012-07-19 9 views
11

Eventuali duplicati:
Getting a FILE* from a std::fstreamRecupero descrittore di file da uno std :: fstream

Sto lavorando su Linux e descrittori di file sono il modello principale di questo sistema operativo.

Mi chiedevo se esiste una libreria o un modo per recuperare il descrittore di file nativo di Linux a partire da un C++ std::fstream.

Ho pensato a boost::iostream poiché c'è una classe chiamata file_descriptor ma ho capito che il suo scopo è diverso da quello che voglio raggiungere.

Conosci qualche modo per farlo?

+1

Perché avete bisogno il descrittore di file? –

+0

Sto cercando anche NON-Standard dal momento che mi atterro alla piattaforma Linux. Ho trovato anche questa pagina. Qualcuno ha usato? Anyhttp: //www.ginac.de/~kreckel/fileno/ –

+6

Questa domanda non è una replica. Questa domanda chiede come ottenere un descrittore di file da un iostream. Un descrittore di file è un concetto di kernel di basso livello. La domanda indicava come l'originale di cui questo è presumibilmente un duplicato parla di flussi FILE *, che non sono la stessa cosa. – Daniel

risposta

5

Si può andare dall'altra parte: implementare il proprio buffer di flusso che avvolge un descrittore di file e quindi utilizzarlo con iostream anziché fstream. L'utilizzo di Boost.Iostreams può semplificare l'attività.

soluzione gcc non-portatile è:

#include <ext/stdio_filebuf.h> 

{ 
    int fd = ...; 
    __gnu_cxx::stdio_filebuf<char> fd_file_buf{fd, std::ios_base::out | std::ios_base::binary}; 
    std::ostream fd_stream{&fd_file_buf}; 
    // Write into fd_stream. 
    // ... 
    // Flushes the stream and closes fd at scope exit. 
} 
2

Non è supportato l'esposizione del descrittore di file né in C++ standard né in libstdc++.

3

Non esiste un metodo (standard) per estrarre il numero di file da uno std :: fstream poiché la libreria standard non impone come verranno implementati i flussi di file.

Piuttosto, è necessario utilizzare l'API del file C se si desidera eseguire questa operazione (utilizzando FILE*).

3

Non esiste un modo ufficiale per ottenere l'handle di file privato di un flusso di file (o in realtà un std::basic_filebuf), solo perché dovrebbe essere portatile e scoraggiare l'uso di funzioni specifiche della piattaforma.

Tuttavia, è possibile fare brutti scherzi come l'ereditarietà di std::basic_filebuf e provare a estrarre l'handle del file. Non è una cosa che raccomando, poiché probabilmente si interromperà su diverse versioni della libreria C++.

Problemi correlati