Feed std :: streambuf per Non-blocking std :: istream Leggi

2

Voglio scrivere una piccola libreria per guidare un processo figlio per esigenze specifiche (non tentare di reinventare la bicicletta qui).

Le mie esigenze includono la lettura da child stdout e stderr . Voglio implementarlo come flussi. Se usassi la semplice discendente std::streambuf che legge direttamente dalla pipe su underflow - allora i miei stdout e stderr bloccherebbero in lettura quando non ci sono dati disponibili. Voglio eludere questo, e finora ho due idee

  1. Fornire un metodo prescelto per i miei flussi, che verifica se ci sono dati. Ho bisogno solo dell'interfaccia binaria di flussi, vale a dire read e write metodi, quindi il metodo che restituisce l'ammontare dei dati disponibili va bene.

  2. Ma aspetta - c'è già un metodo, con un comportamento che corrisponde quasi al mio desiderio. std :: streambuf :: in_avail . Cosa succede se inizierò il thread in background che alimenterà i dati dalle pipe al mio streambuf? Quindi potrei usare il metodo standard di streaming std :: istream :: readsome .

  3. Mix di due precedenti: fornire un metodo per i flussi, che leggerà i dati dal buffer pipe a streambuf . È come svuotare per std::istream . Ciò elimina la necessità in un thread in background.

Personalmente, mi piace di più la seconda variante, ma ritengo che abbia molti avvertimenti.

Quale variante è migliore in termini di leggibilità del codice, prestazioni e usabilità dell'interfaccia?

    
posta Vasilly.Prokopyev 13.10.2015 - 12:27
fonte

1 risposta

1

Sembra che come ratchet freak ha detto nei commenti, la soluzione migliore è usare l'IO asincrono. E userò boost::asio . Ha un buon supporto per le pipe.

Windows: link POSIX: link

    
risposta data 13.10.2015 - 14:56
fonte

Leggi altre domande sui tag