ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – Win32 – 从超时读取stdin

2019-09-27 10:05:20  阅读:256  来源: 互联网

标签:c-3 stdio c winapi


我正在尝试做一些我认为应该简单的事情:从标准输入执行阻塞读取,但如果没有可用数据,则在指定的时间间隔后超时.

在Unix世界中,这对于select()来说很简单,但是在Windows中不起作用,因为stdin不是套接字.如果没有创建额外的线程等,下一个最简单的选择是什么?

我正在使用针对Win32环境的visual C.

到目前为止我尝试过:

>使用select(如果输入不是套接字则不起作用)
>使用WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE)). – 雷米的第一个建议.如果标准输入是控制台(其他人报告了同样的问题),当你调用它时,它总是会立即返回
>使用重叠IO并执行WaitForSingleObject(Remy的第三个建议).在这种情况下,当输入来自控制台时,读取似乎总是阻塞 – 似乎stdin不支持异步I / O.

目前我认为我唯一剩下的选择是创建一个线程,它将执行阻塞读取,然后发出事件信号,然后让另一个线程等待事件超时.

解决方法:

我不得不解决类似的问题.在Windows上,它不像Linux那么容易或明显.但是,这是可能的.诀窍是Windows将控制台事件放在控制台输入事件队列中.您必须过滤掉您不关心的事件,并且只处理您关心的事件(如按键).

进一步阅读:see the Win32 console documentation

以下是一些基于我正在研究的套接字和stdin多路复用器的主要调试示例代码:

void ProcessStdin(void)
{
    INPUT_RECORD record;
    DWORD numRead;
    if(!ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &record, 1, &numRead)) {
        // hmm handle this error somehow...
        return;
    }

    if(record.EventType != KEY_EVENT) {
        // don't care about other console events
        return;
    }

    if(!record.Event.KeyEvent.bKeyDown) {
        // really only care about keydown
        return;
    }

    // if you're setup for ASCII, process this:
    //record.Event.KeyEvent.uChar.AsciiChar

} // end ProcessStdin

int main(char argc, char* argv[])
{
    HANDLE eventHandles[] = {
        GetStdHandle(STD_INPUT_HANDLE)
        // ... add more handles and/or sockets here
        };

    DWORD result = WSAWaitForMultipleEvents(sizeof(eventHandles)/sizeof(eventHandle[0]), 
        &eventHandles[0], 
        FALSE, 
        1000, 
        TRUE
        );

    switch(result) {
        case WSA_WAIT_TIMEOUT: // no I/O going on right now
            break;

        case WSA_WAIT_EVENT_0 + 0: // stdin at array index 0
            ProcessStdin();
            break;

        case WSA_WAIT_EVENT_0 + 1: // handle/socket at array index 1
            break;

        case WSA_WAIT_EVENT_0 + 2: // ... and so on
            break;

        default: // handle the other possible conditions
            break;
    } // end switch result
}

标签:c-3,stdio,c,winapi
来源: https://codeday.me/bug/20190927/1823547.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有