回答
既然你问的不是使用的kqueue为OS X在Windows特定功能,直接您可以尝试libevent。它是不同AIO机制的薄包装,它可以在两种平台上工作。
使用KQUEUE
谢谢..示例代码示例如何使用它获取异步IO完成通知.... – anonymos 2011-06-09 04:25:59
当文件描述符准备就绪时,类似于poll和select(以及Linux上的epoll),kqueue信号。 IOCP在电源I/O操作完成时发出信号。因此信号位于I/O的另一端。 在MacOSX中,FreeBSD和iOS相当于Windows IOCP,是GCD中的I/O功能。但是他们在引擎盖下使用了kqueue和全局线程池。 – 2015-01-03 16:15:16
不幸的是,没有。
kqueue是在OSX和FreeBSD上高性能异步I/O的机制。与Linux epoll相比,它与IOCP(Solaris,AIX,Windows)相比,在I/O的另一端发出信号。 kqueue和epoll会在可以尝试读取或写入时发出信号,而IOCP将在读取或写入完成时回调。许多人发现,与IOCP模型相比,epoll和kqueue使用的信号机制难以理解。因此,虽然kqueue和IOCP都是高性能异步I/O的机制,但它们不具有可比性。
可以使用epoll或kqueue和线程池来实现IOCP。你可以在Wine项目中找到一个例子。
更正:
的Mac OS X有像Grand Central Dispatch功能IOCP的实现。它在内部使用GCD线程池和kqueue API。防御功能是dispatch_read
和。与IOCP类似,I/O任务完成时GCD信号中的异步I/O函数,而不是像原始kqueue API那样准备好文件描述符时。
请注意,GCD API不是“叉式安全”的,并且不能在POSIX fork
的两侧使用,且不能使用exec
。如果你这样做,函数调用将永远不会返回。
另外要注意的是,在FreeBSD上,Mac OS X中的kqueue比kqueue性能低,所以它可能比开发更适合开发。然而,GCD(libdispatch)是Open Source,并且可以在其他平台上使用。
更新2015年1月3日:
FreeBSD有GCD的8.1版本。 Wine为Linux提供基于epoll的IOCP。因此可以使用IOCP设计来编写应该在Windows,Linux,Solaris,AIX,FreeBSD,MacOSX(和iOS,但不是Android)上运行的服务器代码。这与直接使用kqueue和epoll不同,Windows服务器必须重构为使用其IOCP,并且很可能性能较低。
- 1. IO完成端口和OpenSSL
- 2. 自动完成兼容Mac OS X libedit
- 3. IO完成端口:WSARecv()如何工作?
- 4. c#并行IO完成端口
- 5. mac os x终端的怪异行为
- 6. .NET如何使用IO线程或IO完成端口?
- 7. 在Mac OS X
- 8. Mac OS X Linker
- 9. 单为Mac OS X小牛
- 10. CNContact为Mac OS X 10.11
- 11. VLCKit为MAC OS X 10.7
- 12. _finddata_t,_findfirst,_findnext为Mac OS-X
- 13. 在Mac OS X
- 14. Mac OS X上的特权端口(端口<1024)上的绑定10.6
- 15. 在Mac OS X
- 16. Mac OS X PackageMaker
- 17. MSCGen for Mac OS X
- 18. 评估OS X端口的可行性
- 19. Mac OS X的10.10优胜美地禁用USB端口
- 20. 在Mac OS X Lion上运行流浪端口
- 21. 端口的Mac OS X应用程序到iPhone
- 22. C++,Mac OS X中的串行端口问题10.6.8
- 23. 将代码粘贴到Mac OS X上的vim终端窗口
- 24. Mac OS X上的串行端口名称
- 25. 如何在Mac OS X中获得USB端口号?
- 26. Mac OS X上的Firebird在不同的端口上
- 27. Mac OS X,Vagrant,Docker,Nginx,Node - 端口如何一起玩?
- 28. 如何在Mac OS X上查找串行端口号?
- 29. 如何在Mac OS X上自动打开终端窗口
- 30. 升级MAC OS X
谢谢..我会尝试使用它.... – anonymos 2011-06-09 04:55:46
libevent使用Windows select()函数。这个功能基本上是一个玩具。它只适用于套接字,通常不适用于文件描述符,并且不能使用多于64个套接字。当只提供64个客户端时,您可以使用线程并阻止I/O。 – 2014-03-26 14:23:07