我试图以异步方式使用串行端口。我可以使用select
,poll
或epoll
和O_NONBLOCK
来进行异步读取和写入操作。但是open
和close
呢?我看过close
块已经超过一秒钟了。如何异步打开和关闭串口?
0
A
回答
1
有其实现真正的异步open()
和close()
(指定O_NONBLOCK
到open()
手段不睡等待连接或输入,实际上不是在后台真正执行该操作)很少操作系统。想到的两个问题是QNX和Hurd,它们都是微内核操作系统设计,其中每个系统调用按定义是可复用的,因此是异步的。
至于为什么,直到open()
完成之前,您无法做任何事情,所以API设计人员从来没有想过要使它成为异步。最近,如果你真的希望它是异步的,请从线程池中调用。 close()
更有趣一点,实际上很难快速关闭文件描述符而不会丢失有价值的信息,而丢失这些信息会导致数据丢失,例如“我试图写出的缓冲数据失败”。但是,如果你真的需要close()
作为异步,只需从线程池调用它。
作为一般规则,如果您拨打open()
和close()
很多,您不能指望高性能。两者都不可避免地涉及到让内核运行大量的代码检查权限,分配内核结构,锁定内核结构等。一般来说,对于高性能的文件I/O,例如,您在开始时打开需要的文件并且永远不要关闭它们。这对于大多数操作系统的出色表现都很有帮助。
相关问题
- 1. 如何关闭打开的串口?
- 2. 打开和关闭串行端口
- 3. 打开和关闭窗口
- 4. 打开和关闭JavaScript窗口
- 5. 打开和关闭com端口
- 6. WPF:打开和关闭窗口
- 7. 如何打开和关闭GPS?
- 8. 如何打开和关闭一组keybinds?
- 9. 如何用Javascript/FB.ui打开和关闭弹出窗口
- 10. 如何同时打开和关闭不同的窗口?
- 11. 如何处理使用MVVM打开和关闭新窗口?
- 12. 如何关闭当前窗口并同时打开新窗口?
- 13. 如何打开弹出窗口并关闭弹出窗口?
- 14. 如何创建关闭主窗口时打开的窗口?
- 15. XCDYouTubeVideoPlayer打开和关闭
- 16. android vibrator打开和关闭
- 17. 打开和关闭绑定
- 18. 打开和关闭蓝牙
- 19. 打开和关闭物理
- 20. DotNetNuke - 打开和关闭树
- 21. 打开和关闭灯
- 22. StreamWriter打开和关闭
- 23. 打开和关闭pconnect
- 24. 打开和关闭功能
- 25. 打开和关闭电路
- 26. 如何异步关闭套接字
- 27. 关闭窗口 - 如何确定窗户是如何打开的?
- 28. 无法打开调试端口:java.net.SocketException异常“套接字关闭”
- 29. Javascript:打开/关闭开关
- 30. 打开的窗口将不会关闭
你为什么要使用非阻塞fds的轮询API('select','poll'等)?只要后面的写入/读取不会被阻塞,并且在非阻塞fds的情况下,它们都会返回,即使没有任何可读的信息,它也会一直返回。 – silen
因为我不想要100%的CPU,并且我有多个fd。 – kptlronyttcna
我想说的是,例如'select'不等待fd是可读的,它等待后续读取不会被阻塞的时刻,这总是针对'O_NONBLOCK'文件描述符。 – silen