Установите стандартный ввод в неблокирующий режим

Как я могу настроить стандартный ввод на неблокирующий в Windows?

На Posix я могу сделать это:

local ffi, F_SETFL, O_NONBLOCK = require 'ffi', 4, 2048
ffi.cdef 'int fcntl(int fd, int cmd, long arg);'
ffi.C.fcntl(0, F_SETFL, O_NONBLOCK)

После этого вызовы io.read возвращаются немедленно, а не ждут ввода.

Как я могу сделать это в Windows? Поддержка консоли Cygwin — это все, что мне нужно. Фрагмент выше работает без ошибок, но не имеет никакого эффекта.


person user11536834    schedule 22.05.2019    source источник
comment
Если стандартный ввод является каналом (вероятно, для терминала Cygwin/MSYS2), мы можем установить неблокирующий режим через SetNamedPipeHandleState. Обратите внимание, что это не обычный асинхронный ввод-вывод (см. этот ответ), но мы не можем изменить режим открытого файла с насколько я знаю, синхронный с асинхронным.   -  person Eryk Sun    schedule 22.05.2019
comment
Спасибо @eryksun, есть идеи, как мне получить дескриптор канала, из которого исходит стандартный ввод? В Posix я просто рассчитываю на то, что FD 0 будет стандартным вводом. Не нужна асинхронность, просто нужно, чтобы io.read немедленно возвращалось независимо от того, есть ли что-нибудь в буфере или нет.   -  person user11536834    schedule 22.05.2019
comment
Это зависит от источника дескриптора файла. Если это среда выполнения Microsoft C, вы можете получить дескриптор через _get_osfhandle(fd). Я не знаю о Cygwin.   -  person Eryk Sun    schedule 22.05.2019
comment
Я обнаружил, что fcntl работает на консоли WSL, которую я бы не возражал против использования вместо Cygwin, но обычные способы входа в режим cbreak/raw там не работают -- stackoverflow.com/questions/56289226/   -  person user11536834    schedule 25.05.2019