我試圖以異步方式使用串行端口。我可以使用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