Ruby 4.0 リファレンスマニュアル

function rb_thread_fd_select

[edit]
int rb_thread_fd_select(int nfds, rb_fdset_t *rfds, rb_fdset_t *wfds, rb_fdset_t *efds, struct timeval *timeout)

複数のファイルディスクリプタを同時に待ちます。 select(2) を呼ぶ関数ですが、GVL を解放して待つので、ほかの Ruby のスレッドが並行して動けます。

1 つのファイルディスクリプタだけを待つときは、rb_io_wait_readable、rb_io_wait_writable、rb_wait_for_single_fd を使ってください。環境によっては(現在は Linux だけ)最適化されているためです。

すべてのポインタに NULL を指定できます。待っている間にほかのスレッドが同じファイルディスクリプタを操作すると、問題が起きることがあります。たとえば、別のスレッドが select 中のファイルディスクリプタを閉じたときの動作は、OS によって大きく異なります。同じファイルディスクリプタを複数のスレッドから操作するのは避けてください。

[PARAM] nfds:
渡したファイルディスクリプタの最大値に 1 を足した値です。
[PARAM] rfds:
読み込みを待つファイルディスクリプタの集合です。戻ったときは、読み込み可能なものだけになります。
[PARAM] wfds:
書き込みを待つファイルディスクリプタの集合です。戻ったときは、書き込み可能なものだけになります。
[PARAM] efds:
例外状態(OOB)を待つファイルディスクリプタの集合です。戻ったときは、例外状態のものだけになります。
[PARAM] timeout:
最大で待つ時間です。戻ったときは、残りの時間になります。
[RETURN]
失敗したときは -1 で、errno が設定されます。タイムアウトしたときは 0 です。それ以外は、返ってきたファイルディスクリプタの総数です。