в окнах, как иметь неблокирующий стандартный ввод, который является перенаправленным каналом? - PullRequest
7 голосов
/ 15 мая 2009

У меня есть программа для Windows C, которая получает данные через перенаправленный канал stdin, примерно так:

./some-data-generator | ./myprogram

Проблема в том, что мне нужно иметь возможность читать с stdin неблокирующим образом. Причина этого заключается в том, что (1) вход является потоком данных, и EOF отсутствует, и (2) программе необходимо иметь возможность прервать поток stdin -читания в любое время. fread блокируется при отсутствии данных, поэтому это очень сложно.

В Unix это не проблема, так как вы можете установить режим блокировки файлового дескриптора с помощью fcntl и O_NONBLOCK. Однако fcntl не существует в Windows.

Я пытался использовать SetNamedPipeHandleState:

    DWORD mode= PIPE_READMODE_BYTE|PIPE_NOWAIT;
    BOOL ok= SetNamedPipeHandleState(GetStdHandle(STD_INPUT_HANDLE), &mode, NULL, NULL);
    DWORD err= GetLastError();

но это не так с ERROR_ACCESS_DENIED (0x5).

Я не уверен, что еще делать. Это на самом деле невозможно (!) Или просто сильно запутано? Ресурсы в сети довольно редки для этой конкретной проблемы.

Ответы [ 2 ]

3 голосов
/ 16 мая 2009

Заказ оформлен, проверьте, готов ли вход для чтения:

  • В режиме консоли вы можете использовать GetNumberOfConsoleInputEvents ().
  • Для перенаправления канала вы можете использовать PeekNamedPipe ()
1 голос
/ 16 мая 2009

Вы можете использовать асинхронный ввод-вывод для чтения из дескриптора, например, вызов ReadFileEx () WIN32. Используйте CancelIo () для прекращения чтения при отсутствии ввода.

См. MSDN на http://msdn.microsoft.com/en-us/library/aa365468(VS.85).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...