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
-
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
ewrite
metodi, quindi il metodo che restituisce l'ammontare dei dati disponibili va bene. -
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 .
-
Mix di due precedenti: fornire un metodo per i flussi, che leggerà i dati dal buffer pipe a
streambuf
. È come svuotare perstd::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?