Есть ли способ сделать файловый дескриптор незаблокированным в 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, как предполагает Уилл. Но перекрытие и неблокирование - это не одно и то же.