Win32:不可能将 iocp 与标准输入句柄一起使用

Posted

技术标签:

【中文标题】Win32:不可能将 iocp 与标准输入句柄一起使用【英文标题】:Win32: Impossible to use iocp with stdin handle 【发布时间】:2019-04-10 18:56:42 【问题描述】:

我想使用 I/O 完成端口在 Windows 中的标准输入上进行异步读取,但此代码不起作用:

#include <windows.h>
#include <stdio.h>

#pragma comment(lib, "Kernel32.lib")

int main() 
    HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
    DWORD number;

    HANDLE iocp = CreateIoCompletionPort(handle, NULL, 0, 0);

    if(iocp == NULL) 
        printf("error : %d\n", GetLastError());
    

我收到错误 87:ERROR_INVALID_PARAMETER

【问题讨论】:

IOCP 需要使用异步打开的文件句柄。我不相信用异步打开标准输入/标准输出是可能的。 我没有找到任何可以异步打开标准输入的东西... 如果您只针对最新的 Windows 版本 (8+),您需要 CreateFile(L"CONIN$", FILE_GENERIC_READ, FILE_SHARE_VALID_FLAGS, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); 而不是 GetStdHandle(STD_INPUT_HANDLE); 在此之后您可以使用 CreateIoCompletionPort 但更好,只需在此处使用 BindIoCompletionCallback。另一个问题,你想要这里的一般逻辑骨架 【参考方案1】:

CreateIOCompletionPort 不能直接与 stdin/stdout 一起使用。 检查this。要么使用线程,要么将标准输入/标准输出重定向到命名管道。

【讨论】:

谢谢!我想我会创建一个线程...与 UNIX API 相比,Windows API 很奇怪 在编写windows时忘记所有来自unix的东西,并且将std::thread用于简单线程。 真的可以用。我们可以在异步模式CreateFile(L"CONIN$", FILE_GENERIC_READ, FILE_SHARE_VALID_FLAGS, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); 下打开控制台,然后通过BindIoCompletionCallback 将其绑定到iocp 或更好。但这将适用于 win7 或 win8(已经忘记),当控制台模型更改并且控制台句柄不是真正的文件句柄时

以上是关于Win32:不可能将 iocp 与标准输入句柄一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 IOCP 将用户定义的数据传递给工作线程?

如何使用 Win32 句柄在 C++ 中获取文件名? [复制]

python win32api win32gui win32con 窗口句柄 发送消息 常用方法 键盘输入

通过 IOCP 进行串行通信

Perl - Win32 - 如何从另一个进程非阻塞读取文件句柄?

Win32API 消息机制