我在鏈接read_async_some()
調用異步讀取串行端口。在某些時候,我需要取消異步讀取,並在關聯的處理程序中檢測到這一事實。從the documentation for cancel()
,我希望通過檢查傳遞給我的處理程序error_code
這樣做簡單:正在關閉boost :: asio :: serial_port with pending read_async_some
此功能使所有未完成的異步讀取或寫入 操作立即完成,並取消 操作處理程序將通過
boost::asio::error::operation_aborted
錯誤。
然而,當我嘗試這一點,我的處理程序被稱爲與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
。任何人都可以解釋爲什麼我沒有得到文檔中描述的行爲?