Is there way to make file descriptor non blocking

2020-03-26 07:21发布

I want to port my code from linux to windows. It is something like this:

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;
}

Now I want have same in windows. Any ideas? Actualy my filehandle is read side of pipe which is created via WinApi CreatePipe method.

标签: c winapi file
3条回答
聊天终结者
2楼-- · 2020-03-26 08:07

The Windows API function CreateNamedPipe has an option to make the handle non-blocking. (See MSDN). Also see the MSDN article on Synchronous and Overlapped I/O. BTW, you can directly compile POSIX compliant code on Windows using MinGW or Cygwin and thus avoid the headache of porting.

查看更多
乱世女痞
3楼-- · 2020-03-26 08:17

The term for non-blocking / asynchronous I/O in Windows is 'overlapped' - that's what you should be looking at.

Basically, you identify a file handle as using overlapped i/o when you open it, and then pass an OVERLAPPED structure into all the read and write calls. The OVERLAPPED structure contains an event handle which can be signalled when the I/O completes.

查看更多
放我归山
4楼-- · 2020-03-26 08:23

Like this:

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

FIONBIO sets the socket in non-blocking mode. Though you should also use OVERLAPPED io as Will suggests. But overlapping and non-blocking is not the same thing.

查看更多
登录 后发表回答