正在关闭具有挂起的read_async_some的boost::asio::serial_port
Closing boost::asio::serial_port with pending read_async_some
我正在链接read_async_some()
调用以从串行端口异步读取。在某个时刻,我需要使用取消异步读取,并在关联的处理程序中检测到这一事实。从cancel()
的文档中,我希望通过检查传递给我的处理程序的error_code
来做到这一点:
此函数导致所有未完成的异步读取或写入要立即完成的操作,以及的处理程序已取消操作将传递CCD_ 4错误。
但是,当我尝试这样做时,调用我的处理程序时会出现invalid_argument
错误,而不是预期的operation_aborted
错误。下面是一个最小的例子,通过使用ptty来模拟串行端口来重现这个问题:
void handle(boost::system::error_code const& error, size_t count)
{
std::cout << "error_code = " << error.message() << std::endl;
}
int main(int argc, char **argv)
{
std::fstream fs("/dev/ttyp0", std::ios::in | std::ios::ate);
boost::asio::io_service io;
boost::asio::serial_port serial(io, "/dev/ttyp0");
std::vector<uint8_t> buffer(1);
serial.async_read_some(boost::asio::buffer(buffer),
boost::bind(&handle,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
)
);
boost::thread thread(boost::bind(&boost::asio::io_service::run, &io));
serial.cancel();
thread.join();
fs.close();
}
至少对我来说,这个程序的输出是error_code = Invalid argument
。有人能解释为什么我没有得到文档中描述的行为吗?
永不终止。如果其他人遇到同样的问题,问题实际上是使用pttys进行测试。事实证明,pttys在用于异步输入时行为不正常,boost::asio
在上面的错误消息中指出了这个问题。
我能够通过使用socat
创建一个模拟环回串行端口来解决这个问题。在这篇博客文章中有很好的说明。
相关文章:
- 为什么std::async使用同一个线程运行函数
- 为什么可以将左值传递给"std::async",即使它引用了右值
- 使用用户定义的参数调用future/async并调用类方法
- 使用 std::async 时死锁,将来作为成员
- 为什么我不能将引用作为 std::async 的函数参数传递
- std::async from std::async in windows xp
- Google Cloud Pubsub Async Streaming API in C++
- -fno-unwind-tables 和 -fno-async-unwind-tables 不起作用 NDK clang
- std::async 如何工作:为什么它会调用这么多次复制/移动?
- std::async 不会立即调用
- async中没有匹配的函数(模板中未解析的类型)
- 为什么以下代码块提供输出"ZZZ(some garbage value)"而不是"ZZ(some garbage value)"
- 错误:在类型 "blah blah" 的绑定引用中删除限定符以初始化"some other blah blah"
- std::async 如果线程是从 DLL 创建的,则会阻止进程退出?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 在Visual Studio中,与std::async一起使用时不调用"thread_local"变量"析构函数,这是一个错误吗?
- 如何称呼表达式"T (&some(...))[2]' 其中 T=字符
- 可能的 std::async 实现错误 Windows
- 为什么使用线程池时嵌套调用 boost::async 会阻塞?
- C++从 std::async 函数读取命名空间中的全局变量标志