select() I/O 與 SIGIO 工作方式的比較

select() 是一個 I/O 多工的技術 (Multiplexing),在 call  function 之前,必須先建立需要偵測的 file descriptor 清單(FD_SET)select() 被呼叫後,會一直等到其中任意一個清單中的 file descriptor 就緒才返回。而且在 select() return 後,就會知道到底哪些 file descriptor 已經就緒。所以我們可以在迴圈中用 FD_ISSET 這個函式檢查。

SIGIO 其實就是一種非同步(Asynchronous) I/O 的技術。程式初始化的時候,我們可以透過 sigaction() 通知核心,若有某個 file description 準備好 I/O 動作時,就送一個訊息通知此程式,這邊的例子是送 SIGIO 的訊號。程式可以用事先 program 好的 function (sa_handler)來處理收到此訊息之後的工作。

嚴格上來說, select() 還是一種同步 (synchronous) I/O 的通知形式,類似 poll 一樣,必須要程式去和系統詢問才能得知是否有事件發生,而 SIGIO 訊號的實作方法,系統會在程式所設定的必要時刻通知原程式,再由 handler 處理事件。我們使用 SIGIO 的時候,必須注意以下三點 (出自於 Advanced Programming in the UNIX Environment  中文版)

  1. 藉由呼叫 signal  sigaction 以建立訊號處理常式
  2. 呼叫 fcntl 函式並以它的 F_STETOWN 命令來設定 PID  GID 以接收 file descriptor 訊號
  3. 呼叫 fcntl 函式並以它的 F_SETFL 命令來設定檔案狀態旗標的 O_ASYNC,以啟用 fd 上的非同步 I/O


你可能感兴趣的:(select() I/O 與 SIGIO 工作方式的比較)