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

Другие вопросы по тегам