2016-07-12 25 views
1

Ich versuche eine Anwendung zu erstellen, die aus dem ftrace pipes bei den Debug-fs liest.Lesen von Ftrace-Pipes mit Boost :: asio posix stream_descriptor

Es scheint, dass, wenn asynchron von trace_pipe oder trace_pipe_raw boost :: asio API zu lesen versucht, die Ereignisse in der Leitung warten werden von dem async_read Griff Bildschirm verarbeitet und gedruckt, aber neue Ereignisse, Eintreffen nach dem Start des Programms löst das async_read-Handle nicht aus.

Mit dem folgenden Beispielcode erhalte ich einen Ausdruck aller Ereignisse, die in der Warteschlange warten, aber ich erhalte keinen Ausdruck für neue Ereignisse, die später eintreffen.

Das gleiche Beispiel funktioniert perfekt, wenn ich versuche, manuell erstellte Pipe mit Mkfifo zu lesen, aber nicht für die Ftrace-Pipes funktioniert.

#include <boost/asio.hpp> 
#include <boost/bind.hpp> 
#include <string> 
#include <iostream> 

namespace asio = boost::asio; 
#ifdef BOOST_ASIO_HAS_POSIX_STREAM_DESCRIPTOR 
typedef asio::posix::stream_descriptor stream_descriptor; 
#endif 

class PipeReader 
{ 
    typedef std::shared_ptr<PipeReader> PipeReaderPtr; 
    typedef std::weak_ptr<PipeReader> PipeReaderWeakPtr; 
public: 
    static PipeReaderWeakPtr Create(asio::io_service& io_service, const std::string& path); 

    void HandleRead(PipeReaderPtr me, const boost::system::error_code &error); 
private: 
    PipeReader(asio::io_service& io_service, const std::string& path); 
    stream_descriptor m_pipe; 
    char buf[4096]; 
}; 

PipeReader::PipeReaderWeakPtr PipeReader::Create(asio::io_service& io_service, const std::string& path) 
{ 
    PipeReaderPtr ptr(new PipeReader(io_service, path)); 

    ptr->m_pipe.async_read_some(boost::asio::buffer(ptr->buf), 
           boost::bind(&PipeReader::HandleRead, 
              ptr.get(), 
              ptr, 
              asio::placeholders::error)); 
    return ptr; 
} 

PipeReader::PipeReader(asio::io_service& io_service, const std::string& path) 
         : m_pipe(io_service) 
{ 
    int dev = open(path.c_str(), O_RDWR); 
    if (dev == -1) { 
     std::cout << "failed to open path - " << path << std::endl; 
    } 
    else 
    { 
     m_pipe.assign(dev); 
    } 
} 

void PipeReader::HandleRead(PipeReaderPtr me, const boost::system::error_code &error) 
{ 
    if (!error) { 
     std::string str(me->buf); 

     std::cout << "got message: " << str << std::endl; 
     m_pipe.async_read_some(boost::asio::buffer(me->buf), 
           boost::bind(&PipeReader::HandleRead, 
              this, 
              me, 
              asio::placeholders::error)); 
    } 
    else 
    { 
     std::cout << "got error - " << error.message() << std::endl; 
    } 
} 


int main() 
{ 
    boost::asio::io_service io_service; 
    boost::asio::io_service::work dummy(io_service); 

    PipeReader::Create(io_service, "/sys/kernel/debug/tracing/trace_pipe"); 

    io_service.run(); 
    return 0; 
} 
+0

Sieht aus wie * trace_pipe * Datei nicht Asynchron-Schnittstelle ('.fasync'-Methode) implementieren. Es ist üblich, dass Dateien unter 'debugfs',' sysfs' und anderen "virtuellen" Dateisystemen nur die meistbenutzten Schnittstellen für den Zugriff auf diese Dateien implementieren. – Tsyvarev

Antwort