Есть ли способ сделать файловый дескриптор неблокирующим в Windows?
Я хочу перенести мой код из Linux в Windows. Это что-то вроде этого:
void SetNonBlocking( int filehandle )
{
int fhFlags;
fhFlags = fcntl(filehandle,F_GETFL);
if (fhFlags < 0)
{
perror("fcntl(F_GETFL)");
exit(1);
}
fhFlags |= O_NONBLOCK;
if (fcntl(filehandle,F_SETFL,fhFlags) < 0)
{
perror("fcntl(F_SETFL)");
exit(1);
}
return;
}
Теперь я хочу иметь то же самое в Windows. Есть идеи? На самом деле мой дескриптор файла - это сторона чтения канала, созданная через WinApi. CreatePipe
метод.
3 ответа
Функция Windows API CreateNamedPipe
имеет возможность сделать ручку неблокируемой. ( См. MSDN). Также см. Статью MSDN о синхронном и перекрывающемся вводе-выводе. Кстати, вы можете напрямую скомпилировать POSIX-совместимый код в Windows, используя MinGW или Cygwin, и таким образом избежать головной боли при портировании.
Термин "неблокирующий / асинхронный ввод / вывод в Windows" "перекрывается" - это то, на что вы должны обратить внимание.
По сути, вы определяете дескриптор файла как использующий перекрывающийся ввод-вывод при открытии, а затем передаете структуру OVERLAPPED во все вызовы чтения и записи. Структура OVERLAPPED содержит дескриптор события, который может сигнализироваться после завершения ввода-вывода.
Как это:
ulong arg = 1;
ioctlsocket(sock, FIONBIO, &arg);
FIONBIO
переводит сокет в неблокирующий режим. Хотя вы должны также использовать OVERLAPPED IO, как предполагает Уилл. Но перекрытие и неблокирование - это не одно и то же.