2017-02-28 21 views
0

我試圖以異步方式使用串行端口。我可以使用selectpollepollO_NONBLOCK來進行異步讀取和寫入操作。但是openclose呢?我看過close塊已經超過一秒鐘了。如何異步打開和關閉串口?

+0

你爲什麼要使用非阻塞fds的輪詢API('select','poll'等)?只要後面的寫入/讀取不會被阻塞,並且在非阻塞fds的情況下,它們都會返回,即使沒有任何可讀的信息,它也會一直返回。 – silen

+0

因爲我不想要100%的CPU,並且我有多個fd。 – kptlronyttcna

+1

我想說的是,例如'select'不等待fd是可讀的,它等待後續讀取不會被阻塞的時刻,這總是針對'O_NONBLOCK'文件描述符。 – silen

回答

1

有其實現真正的異步open()close()(指定O_NONBLOCKopen()手段不睡等待連接或輸入,實際上不是在後臺真正執行該操作)很少操作系統。想到的兩個問題是QNX和Hurd,它們都是微內核操作系統設計,其中每個系統調用按定義是可複用的,因此是異步的。

至於爲什麼,直到open()完成之前,您無法做任何事情,所以API設計人員從來沒有想過要使它成爲異步。最近,如果你真的希望它是異步的,請從線程池中調用。 close()更有趣一點,實際上很難快速關閉文件描述符而不會丟失有價值的信息,而丟失這些信息會導致數據丟失,例如「我試圖寫出的緩衝數據失敗」。但是,如果你真的需要close()作爲異步,只需從線程池調用它。

作爲一般規則,如果您撥打open()close()很多,您不能指望高性能。兩者都不可避免地涉及到讓內核運行大量的代碼檢查權限,分配內核結構,鎖定內核結構等。一般來說,對於高性能的文件I/O,例如,您在開始時打開需要的文件並且永遠不要關閉它們。這對於大多數操作系統的出色表現都很有幫助。