有没有办法在Windows中使文件描述符变成非阻塞的?

5

我希望将我的代码从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个回答

2
在Windows中,非阻塞/异步I/O的术语是“重叠”-这就是你应该关注的内容。
基本上,当你打开一个文件句柄时,你可以将其标识为使用重叠I/O,然后在所有读写调用中传递一个OVERLAPPED结构。OVERLAPPED结构包含一个事件句柄,当I/O完成时可以发出信号。

1

像这样:

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

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


4
这仅适用于套接字,而不是文件。OP有一个文件。 - Andy

0
Windows API函数CreateNamedPipe有一个选项可以使句柄非阻塞。 (请参见MSDN)。还可以参考MSDN文章同步和重叠I/O。顺便说一下,您可以使用MinGWCygwin直接在Windows上编译符合POSIX标准的代码,从而避免移植的麻烦。

2
  1. MSDN的链接很有用,但不能解决我所有的问题。他们解释了如何以非阻塞方式读取或写入文件的HANDLE,但没有说明如何让文件的HANDLE变为非阻塞。如果HANDLE是非阻塞的,我就可以将其转换为FILE*,然后通过fgets、fscanf等来读取,并且这些操作不会阻止程序运行。但如果只有读和写是非阻塞的,那么它的灵活性就较低,我必须使用WinApi的读写方法进行非阻塞操作。
  2. Cygwin和MinGW未实现完整的posix功能。我的问题正是来自于那部分未实现的功能。
- Mihran Hovsepyan
MinGW并不试图提供任何良好的POSIX兼容性。 - rubenvb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接