Есть ли способ сделать файловый дескриптор неблокирующим в Windows? - PullRequest
3 голосов
/ 15 марта 2011

Я хочу перенести свой код из 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 ]

1 голос
/ 15 марта 2011

Термин «неблокирующий / асинхронный ввод / вывод в Windows» «перекрывается» - это то, на что вы должны смотреть.

По сути, вы идентифицируете дескриптор файла как использование перекрывающегося ввода / вывода, когдаоткройте его, а затем передайте структуру OVERLAPPED во все вызовы чтения и записи.Структура OVERLAPPED содержит дескриптор события, о котором может быть сообщено после завершения ввода / вывода.

0 голосов
/ 31 марта 2014

Как это:

ulong arg = 1;
ioctlsocket(sock, FIONBIO, &arg);

FIONBIO переводит сокет в неблокирующий режим. Хотя вы должны также использовать OVERLAPPED IO, как предполагает Уилл. Но перекрытие и неблокирование - это не одно и то же.

0 голосов
/ 15 марта 2011

Функция Windows API CreateNamedPipe позволяет отключить блокировку дескриптора. ( См. MSDN ). Также см. Статью MSDN по Синхронный и перекрывающийся ввод-вывод . Кстати, вы можете напрямую скомпилировать POSIX-совместимый код в Windows, используя MinGW или Cygwin и, таким образом, избежать головной боли при переносе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...