- 1. 概要
- 2. select 読み書きの情報を取得
- 3. pselect
1. 概要
「select.h」では、同期入出力多重化を行う、「select」関数を定義しています。
本ページは、下記のサイトを参考にさせていただきました。
「select()」
2. select 読み書きの情報を取得
わたしは、双方向通信を行う、「socket」で、受信データの有無を確認するのに使用していました。
#include <sys/select.h>
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
「readfds」,「writefds」および「exceptfds」でアドレスを渡された入出力記述子集合を調べ、それらの記述子のいくつかがそれぞれ、読
取り準備完了であるか、書込み準備完了であるか、または保留されている例外条件があるかを調べます。
検出可能な唯一の例外条件は、ソケット上に受信した帯域外のデータです。最初の nfds 個の記述子が各集合内でチェックされます。
すなわち、記述子集合中の「0」~「nfds-1」の記述子が調べられます。
戻り時に「select()」システムコールは指定の記述子集合を、要求された操作の準備ができている記述子で構成される部分集合で置き換えます。
「select()」は、すべての集合の中で準備ができた記述子の総数を返します。
以下の設定を行うと、「select()」は、単なるタイマとして使用することができます。
・読み取り、書き込み、および例外配列を「0」に設定
・「nfds」を「NULL」ポインターになるように設定
3. pselect
「pselect()」は、「POSIX」版の「select」です。
#include <sys/select.h>
int pselect(int nfds, fd_set * restrict readfds, fd_set * restrict writefds,
fd_set * restrict exceptfds,
const struct timespec * restrict timeout,
const sigset_t * restrict newsigmask);
「pselect() は、「IEEE Std 1003.1g-2000(“POSIX.1g”) 」で、「select()」のわずかに強力なバージョンとして導入されました。
「nfds」「readfds」「writefds」「exceptfds」引数はすべて、「select()」の類似の引数と同じです。
「pselect()」の「timeout」引数は、「select()」で使用される変更可能な、「struct timeval」ではなく、「const struct timespec」を指します。
「select()」と同様に、「pselect()」が無期限に待機する必要があることを示すために、「null」ポインターを渡すこともできます。
「newsigmask」は、入力を待機している間に設定されるシグナル マスクを指定します。
「pselect()」が戻ると、元のシグナル マスクが復元されます。
「newsigmask」が「null」ポインターの場合、「pselect()」はシグナル マスクの設定や復元を行わずに「select()」のように動作します。
このインターフェイスのセマンティクスの詳細な説明、および「fd_set」データ型の操作に使用されるマクロについては、「select() 」を参照してください。
「pselect()」は、「select()」と同じ条件で同じ値を返します。
「pselect()」関数は、「select() 」および (シグナル マスクが指定されている場合) 「sigprocmask()」で説明されている理由のいずれかで失敗する可能性があります。
参照
「kqueue()」「poll()」「select()」「sigprocmask()」「sigsuspend()」
|
|