Есть ли способ сделать файловый дескриптор незаблокированным в 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;
}
Теперь я хочу иметь то же самое в окнах. Есть идеи? Фактически мой файловый дескриптор является частью чтения трубы, созданной с помощью метода WinApi CreatePipe
.
Ответы
Ответ 1
Функция API Windows CreateNamedPipe
имеет возможность сделать блок неблокирующим. (См. MSDN). Также см. Статью MSDN на Синхронный и перекрывающийся ввод-вывод. BTW, вы можете напрямую скомпилировать POSIX-совместимый код в Windows, используя MinGW или Cygwin и, таким образом, избежать головной боли портирования.
Ответ 2
Термин для неблокирующего/асинхронного ввода-вывода в Windows "перекрывается" - это то, что вы должны смотреть.
В основном вы определяете дескриптор файла с использованием перекрывающегося ввода-вывода при его открытии, а затем передаете структуру OVERLAPPED во все вызовы чтения и записи. Структура OVERLAPPED содержит дескриптор события, который может сигнализироваться при завершении ввода-вывода.
Ответ 3
Вот так:
ulong arg = 1;
ioctlsocket(sock, FIONBIO, &arg);
FIONBIO
устанавливает сокет в неблокирующий режим. Хотя вы также должны использовать OVERLAPPED io, как предполагает Уилл. Но перекрытие и неблокирование - это не одно и то же.