У меня есть программа для 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
).
Я не уверен, что еще делать. Это на самом деле невозможно (!) Или просто сильно запутано? Ресурсы в сети довольно редки для этой конкретной проблемы.