디버그 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;
}
*이 trace_pipe * 파일이 비동기 인터페이스 ('.fasync' 방법)를 구현하지 않는 것 같습니다. 'debugfs','sysfs' 및 다른 "가상"파일 시스템에있는 파일들은 그 파일에 액세스하기 위해 주로 사용되는 인터페이스 만 구현하는 것이 일반적입니다. – Tsyvarev