有没有办法在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中有相同的function。 有任何想法吗? Actualy我的文件句柄是管道的读取端,通过WinApi CreatePipe方法创建。

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

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

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

像这样:

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

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