非同期通信その2

入出力の多重化

プロセス間通信を行うには、ソケットのディスクリプタ(ソケット番号と呼んでもいい気が)を通じて行います。どのディスクリプタからデータが読めるかを管理するものとして、「fd_set」と呼ばれるデータ構造(ビットマスク)が用意されています。ディスクリプタを通じて非同期に入力するには、このビットマスクで使用したいディスクリプタを指定して、select関数を呼び出します。

  • 「fd_set」関連の定義位置
    sys/types.h内
  • 「fd_set」
    各ビットがディスクリプタに対応しています。例えば、ディスクリプタ「3」にはビット3が対応します。
  • 「fd_set」ビットマスク操作マクロ
    • FD_SET(n, p)
      ディスクリプタ「n」が有効にします。(pをアドレスとするビットマスクの第nビットを立てます。)
    • FD_CLR(n, p)
      ディスクリプタ「n」を無効にします。(pをアドレスとするビットマスクの第nビットをクリアします。)
    • FD_ISSET(n, p)
      ディスクリプタ「n」が有効かを返します。(pをアドレスとするビットマスクの第nビットが立っていれば「1」を返します。)
    • FD_ZERO(p)
      全てのディスクリプタを無効にします。(pをアドレスとするビットマスクをゼロクリアします。)
  • select関数の呼び出し
    • FD_SET()で有効にしたいディスクリプタを指定します
    • select(n, p, NULL, NULL, NULL)を呼び出します
      nは有効ビット幅の指定、第3,4,5引数はとりあえずNULLとします。
    • select関数を呼ぶと、ビットマスクの内容は壊れてしまうため、selectを呼ぶときにはテンポラリのビットマスクにコピーしてから呼び出すのが常套手段です。

今日はここまで。
いかん、全然進まん(^^;