有没有办法在Windows中使文件描述符不阻塞?

时间:2011-03-15 08:41:37

标签: c winapi file

我想将我的代码从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中拥有相同的功能。有任何想法吗? Actualy我的文件句柄是管道的读取端,通过WinApi CreatePipe方法创建。

3 个答案:

答案 0 :(得分:1)

Windows中非阻塞/异步I / O的术语是“重叠” - 这就是您应该关注的内容。

基本上,当您打开文件句柄时,将文件句柄识别为使用重叠的i / o,然后将OVERLAPPED结构传递给所有读写调用。 OVERLAPPED结构包含一个事件句柄,可以在I / O完成时发出信号。

答案 1 :(得分:0)

像这样:

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

FIONBIO将套接字设置为非阻塞模式。虽然你也应该像Will建议的那样使用OVERLAPPED io。但重叠和非阻塞不是一回事。

答案 2 :(得分:-1)

Windows API函数CreateNamedPipe可以选择使句柄无阻塞。 (See MSDN)。另请参阅Synchronous and Overlapped I/O上的MSDN文章。顺便说一句,您可以使用MinGWCygwin在Windows上直接编译符合POSIX标准的代码,从而避免移植的麻烦。