我需要将一些POSIX代码翻译成Windows,但是在异步IO方面我遇到了麻烦。在POSIX上,我们使用select
来确定数据是在多个管道之一还是在套接字上可用。
我们正在为这样的子进程的管道设置HANDLE
:
ZeroMemory(&startInfo, sizeof(STARTUPINFO));
startInfo.cb = sizeof(STARTUPINFO);
startInfo.hStdInput = hInRead;
startInfo.hStdOutput = hOutWrite;
startInfo.hStdError = hErrWrite;
startInfo.dwFlags |= STARTF_USESTDHANDLES;
我们可以使用HANDLE
s hOutRead
和hErrRead
从stdout和stderr中读取。但是,我们需要弄清楚哪些流可用数据。
此外,还有一个套接字,我们也需要从该套接字读取数据。我们像往常一样创建套接字(跳过错误处理):
s = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
connect(s, ptr->ai_addr, (int)ptr->ai_addrlen);
并使用recv
接收数据,但同步。
我们如何同时读取所有三个流的数据?目前,我们使用CreateThread
每个流有一个线程,但我们认为这是非常低效的。在Windows上有原生方式吗?