非同期通信その2
入出力の多重化
プロセス間通信を行うには、ソケットのディスクリプタ(ソケット番号と呼んでもいい気が)を通じて行います。どのディスクリプタからデータが読めるかを管理するものとして、「fd_set」と呼ばれるデータ構造(ビットマスク)が用意されています。ディスクリプタを通じて非同期に入力するには、このビットマスクで使用したいディスクリプタを指定して、select関数を呼び出します。
- 「fd_set」関連の定義位置
sys/types.h内 - 「fd_set」
各ビットがディスクリプタに対応しています。例えば、ディスクリプタ「3」にはビット3が対応します。 - 「fd_set」ビットマスク操作マクロ
- select関数の呼び出し
- FD_SET()で有効にしたいディスクリプタを指定します
- select(n, p, NULL, NULL, NULL)を呼び出します
nは有効ビット幅の指定、第3,4,5引数はとりあえずNULLとします。 - select関数を呼ぶと、ビットマスクの内容は壊れてしまうため、selectを呼ぶときにはテンポラリのビットマスクにコピーしてから呼び出すのが常套手段です。
今日はここまで。
いかん、全然進まん(^^;
非同期通信 その1
いよいよ非同期通信に入ります。題材は鬼ごっこ。
画面制御「curses」ライブラリ
ちょっと寄り道になってしまうのですが、キャラクタベースの端末での制御が基本なので、お付き合いをします(^^;
- 「curses」ライブラリを使うと、キャラクタベースのウインドウが扱える
ちょっとびっくり。へ〜。
ウィンドウを扱う関数は、原始的だけど、ハンドルを使った擬似C++メンバー関数的な作りになっているのは、当たり前だけど関心しました。これならWindowsプログラミングの経験が役立つので、楽に理解できそうです。(こんなこと書くと、UNIXバリバリの人から怒られそうだな(^^;)- WINDOWオブジェクト生成:
「WINDOW」オブジェクトへのポインタを宣言して、「newwin(行数, 桁数, 左上y座標, 左上x座標)」でインスタンス化 - Window枠の描画:
「box(win, 縦線文字, 横線文字)」 - 文字出力:
「waddch(win, ch)」 - カーソル移動:
「wmove(win, y, x)」 - 画面リフレッシュ:
「wrefresh(win)」 - 端末の設定変更:
バッファリングをなくす「cbreak()」、エコーをやめる「noecho()」
- WINDOWオブジェクト生成:
今日はここまで。
RD-XS46導入でガンガン録れるようになったのが嬉しくて、録画消化が大変で時間が取れませんでした。これまた本末転倒(^^; 来週末に定期録画の内容を見直さないと、、、
RD-XS46
せっかく昨日届いていたのに疲れきっていたため、今日になって開封。セッティングしました。
RD-XS30を使っていたため、基本的な操作は問題なし。ただ、ネットワーク設定ではまりました。うちは各部屋にLANを配線していて、アンテナ端子の横にLAN端子があるため、繋げばすぐに動くだろうとタカを括っていました。
ところが、付属のLANケーブルを接続しても繋がりません。説明書を読んでみると、付属のものはクロスケーブルとのこと(^^; 気を取り直して手持ちのストレートケーブルに交換しました。
それでも繋がりません。ルーター(NetGenesis Super Opt 90)のファームウェアを1年以上放ったらかしなのも良くないかも、ということでファームウェアをバージョンアップ。いつの間にかUPnPに対応していたり色々と機能が向上している模様。しまった(笑)
さあ、これで繋がるだろう、と思ったら繋がらず。ええっ?!もしや?とLANケーブルを交換。これでやっと接続できるようになり、ようやく電子番組表などフル機能が使えるようになりました。
まだ大して使ってませんが、簡単に気づいたところを以下にまとめておきます。(事前に気づいていた項目も挙げてます)