我想将我的代码从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
方法创建。
答案 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文章。顺便说一句,您可以使用MinGW或Cygwin在Windows上直接编译符合POSIX标准的代码,从而避免移植的麻烦。