2016-07-12 2 views
1

Je suis en train de construire une application qui lit le ftrace pipes au débogage fs.lecture tuyaux de ftrace avec boost :: asio posix stream_descriptor

Il semble que lorsque vous essayez de lire de façon asynchrone de trace_pipe ou trace_pipe_raw utilisant boost :: API asio, les événements en attente dans la conduite sont en cours traité et imprimé à l'écran par la poignée de async_read, mais de nouveaux événements arrivent après le démarrage du programme ne déclenchent pas le handle async_read.

L'exécution du code exemple ci-dessous, je suis d'obtenir une copie de tous les événements dans la file d'attente, mais je ne pas obtenir l'impression de nouveaux événements qui arrivent plus tard.

Le même échantillon fonctionne parfaitement si j'essaie de lire tuyau créé manuellement à l'aide mkfifo mais ne fonctionne pas pour les tuyaux de ftrace.

#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

RESSEMBLE * trace_pipe fichier * ne met pas en oeuvre l'interface asynchrone (méthode '.fasync'). Il est habituel pour les fichiers sous 'debugfs',' sysfs' et d'autres systèmes de fichiers « virtuels » pour mettre en œuvre que la plupart des interfaces utilisées pour l'accès que les fichiers. – Tsyvarev

Répondre