2016-07-12 11 views
1

私はデバッグfsでftrace pipesから読み込むアプリケーションをビルドしようとしています。Boost :: asioでftraceパイプを読むposix stream_descriptor

trace_pipeまたは ブーストを使用してtrace_pipe_raw :: ASIO APIから非同期読み込みしようとしたとき、パイプ内で待機中のイベントが が処理され、async_readハンドルによって画面に表示されているようですが、その新しいイベントプログラムの開始後に到着すると、async_readハンドルがトリガーされません。

以下のサンプルコードを実行すると、キュー内で待機しているすべてのイベントのプリントが表示されますが、後で到着する新しいイベントのプリントが表示されません。

mkfifoを使用して手動で作成したパイプから読み込もうとしているが、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

は* trace_pipe *ファイルは、非同期インターフェイス( '.fasync'メソッド)を実装していないように見えます。 'debugfs'、' sysfs'や他の「仮想」ファイルシステムのファイルは、そのファイルにアクセスするために主に使用されるインターフェースだけを実装するのが普通です。 – Tsyvarev

答えて

1

この問題が見つかりました。 epollをハングアップさせたftraceの実装におけるバグでした。 このバグはカーネル3.16で修正されました。

correspondence threadcommit in git hub

関連する問題