【问题标题】:win7 boost::asio::windows::stream_handle constructor throws errorwin7 boost::asio::windows::stream_handle 构造函数抛出错误
【发布时间】:2014-12-04 03:51:34
【问题描述】:

以下代码在尝试执行最后一行时出错

 boost::shared_ptr<boost::asio::io_service> ioServicePtr(new boost::asio::io_service());
 //setup the terminal with stdin and stdout

 int inFD = ::dup(STDIN_FILENO);

 int outFD = ::dup(STDOUT_FILENO);

 HANDLE osfhandle = (HANDLE)_get_osfhandle(inFD);//osfhandle is valid

 boost::asio::windows::stream_handle inputStream(*ioServicePtr, osfhandle); //error

错误是:

uncaught exception of type N5boost16exception_detail10clone_implINS0_19error_info_injectorINS_6system12system_errorEEEEE
- assign: The parameter is incorrect

感谢您的意见。

@sehe

我试过了

hstdhandle = GetStdHandle(STD_OUTPUT_HANDLE);

得到同样的错误

然后我尝试了

HANDLE handle= 
CreateFile(
    "CONIN$", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 
    FILE_FLAG_OVERLAPPED, NULL);
boost::asio::windows::stream_handle inputStream(*ioServicePtr, handle); 

错误是

-assign handle invalid

【问题讨论】:

    标签: windows-7 boost-asio


    【解决方案1】:

    你可以使用GetStdHandle,所以:

    HANDLE isfhandle = GetStdHandle(STD_INPUT_HANDLE);
    

    但是,我认为控制台不支持 windows 中的异步 IO:

    • 句柄必须指向支持重叠 I/O 的对象。

      如果提供了句柄,则必须为重叠 I/O 完成打开它。例如,您必须 使用CreateFile函数获取句柄时指定FILE_FLAG_OVERLAPPED标志

      但 CreateFile 的文档进一步说 CreateFile 在创建控制台缓冲区的句柄时会忽略文件标志。

    因此,您需要模拟 stdin/stdout 异步 IO。


    请注意,在 Linux 上,标准 IO 句柄的异步 IO 仅在某些情况下是可能的 - 取决于被重定向的输入/输出:Strange exception throw - assign: Operation not permitted

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 2016-10-10
      • 2018-06-03
      • 1970-01-01
      • 2015-12-06
      相关资源
      最近更新 更多