select


目次に戻る


久しぶりにUNIXでのみサポートされている関数を紹介したい。
 
今日紹介するselectはファイルディスクリプタに対して読み書きがノンブロック(待ち 無し)で行えるか調べる関数である。なんの事かさっぱりわからない人向けに簡単に説明 すると、「今開いているファイルやソケット、標準入出力、パイプに対して待ち無しでread、 writeが実行できるか確認する」関数になります。
 
たいていソケット通信(TCP/IP)や標準入出力、パイプに対してread、writeができる か確認するために使います。
 
使い方は単純ではありません。詳しい文法は Manpage of SELECT(@Linux JM Project) もしくはお手持ちのUNIX上の man を見てください。
 
昨日紹介したkbhitをUNIXで実装すると次のようになります。
例:UNIX版kbhit 「標準入力(stdin)からノンブロックでreadできるか調べた い」
int unix_kbhit( void )
{
fd_set readfds;    /* selectに渡す為のデータ(入力− read −できるか調べたいディスクリプタの集合) */
int n;        /* 調べたいファイルディスクリ プタの値の最大値+1 */
struct timeval timeout;    /* タイムアウト時間 */
int re;    /* 戻り値保持用 */

/* 引数に渡すデータを初期化 */
FD_ZERO( &readfds );    /* 集合の要素をクリア */
FD_SET( STDIN_FILENO , &readfds );    /* 標準入力を集合 に追加 */

n = STDIN_FILENO + 1;

timeout.tv_sec = 0;    /* タイムアウトは0 = selectはノンブロック */
timeout.tv_usec = 0;

re = select( n , &readfds , NULL , NULL , &timeout );

if( re > 0 ){
    return 1;    /* なにかキーを押した */
} else {
    return 0;    /* なんにも押してない */
}

}


目次に戻る