मैं अपने पूरे प्रोजेक्ट में बूस्ट एएसओ का उपयोग कर रहा हूं। अब मैं एक डिवाइस फ़ाइल (/dev/input/eventX
) पढ़ना चाहता हूं। बढ़ावा asio प्रलेखन में यह कहा गया है कि सामान्य फाइल आईओ संभव नहीं है लेकिन इस उपकरण फाइल या पाइप asio::posix::stream_descriptor.
डिवाइस फ़ाइलों के साथ एएसओ का उपयोग कैसे करें
का उपयोग कर रहा खुला के माध्यम से फ़ाइल वर्णनकर्ता खोला और यह stream_descriptor करने के लिए सौंपा द्वारा समर्थित हैं। अब मैं async_read()
कॉल जारी करता हूं जो कभी वापस नहीं आता है।
क्या इनपुट घटनाओं के साथ बूस्ट एएसओ का उपयोग करना संभव है? क्या Iioct के माध्यम से asio के साथ इसका उपयोग करने से पहले फ़ाइल हैंडल को कॉन्फ़िगर करने की आवश्यकता है?
संपादित करें: कुछ उदाहरण कोड जोड़ें -> कुछ उदाहरण कोड जोड़ा गया।
निम्नलिखित कोड/dev/input/event12 खुलता है और io_service ऑब्जेक्ट पर रन विधि कहा जाता है।
#include <boost/asio.hpp>
#include <string>
#include <iostream>
#include <boost/bind.hpp>
#include <linux/input.h>
namespace asio = boost::asio;
#ifdef BOOST_ASIO_HAS_POSIX_STREAM_DESCRIPTOR
typedef asio::posix::stream_descriptor stream_descriptor;
#else // BOOST_ASIO_HAS_POSIX_STREAM_DESCRIPTOR
typedef asio::windows::stream_handle stream_descriptor;
#endif // BOOST_ASIO_HAS_POSIX_STREAM_DESCRIPTOR
class FileReader
{
typedef boost::shared_ptr<asio::streambuf> StreambufPtr;
typedef boost::shared_ptr<FileReader> FileReaderPtr;
typedef boost::weak_ptr<FileReader> FileReaderWeakPtr;
public:
static FileReaderWeakPtr Create(asio::io_service& io_service, const std::string& path);
virtual ~FileReader();
void HandleRead(FileReaderPtr me, StreambufPtr sb,
const boost::system::error_code &error);
private:
FileReader(asio::io_service& io_service, const std::string& path);
stream_descriptor m_InputStream;
};
FileReader::FileReaderWeakPtr FileReader::Create(asio::io_service& io_service,
const std::string& path){
FileReaderPtr ptr(new FileReader(io_service, path));
StreambufPtr sb(new boost::asio::streambuf());
asio::async_read(ptr->m_InputStream, *sb,
boost::bind(&FileReader::HandleRead, ptr.get(),
ptr, sb, asio::placeholders::error));
return ptr;
}
FileReader::FileReader(asio::io_service& io_service, const std::string& path)
:m_InputStream(io_service)
{
int dev = open(path.c_str(), O_RDONLY);
if (dev == -1) {
throw std::runtime_error("failed to open device " + path);
}
m_InputStream.assign(dev);
}
void FileReader::HandleRead(FileReaderPtr me, StreambufPtr sb,
const boost::system::error_code &error) {
if(!error) {
//Inform all of a sucessfull read
std::istream is(sb.get());
size_t data_length = sb->size();
asio::async_read(m_InputStream, *sb,
boost::bind(&FileReader::HandleRead, this, me, sb, asio::placeholders::error));
}
}
async_read() को कॉल वापस नहीं आता है या क्या आपका मतलब है कि कॉलबैक नहीं आती है? कोड के बिना निदान करना मुश्किल है। क्या आपको io_service :: run() को कॉल करना याद आया? इसके लायक होने के लिए, मैंने बिल्कुल यह किया है और यह निश्चित रूप से काम करता है। – Sean
@sean कॉलबैक कभी भी बुनाई नहीं है। –