GNU Octave に named pipe から読み込ませる
ビーコンモニタの Raspberry Pi への移植プロジェクトは続きます。
Raspberry Pi でも Octave は十分に使えそうですが、起動時に pkg を読み込む(pkg load signal とか)のに時間がかかるのが辛いです。
いままでは、贅沢にも毎回 Octave を起動し直していたのですが、作戦変更で、Octave はずっと起動させたままにしておき、外から適宜ファイルを食わせることにしました。
ここで問題は、例えばコマンド列やデータをファイルで食わせるとき、ファイルが EOF になると fread() が空ベクトルを返してしまうことです。GNU Octave の 3.6.2 版で試してみましたが、一度 fread() が EOF を検出すると、その後ファイルに追記しても再読み込みはできない感じです。例えば、こんなコードを試しましたがダメでした。
fd = fopen("cmd.dat", "rb"); while true in = fread(fd, [1 16], "short"); printf("len = %d\n", length(in)); if length(in) <= 0 sleep(1); endif end
そこで、これは以前に(Octave ではありませんが)思いついた方法として、named pipe (FIFO) を使ってみました。まず、named pipe を作ります。
$ mknod cmd.dat p
そんでもって、次のようなコードを動かします。
fd = fopen("cmd.dat", "rb"); while true in = fread(fd, [1 16], "short"); printf("len = %d\n", length(in)); if length(in) <= 0 quit(0); endif end
この方法ですと、書き手が named pipe をクローズしない限り、入力データがない間 fread() はブロックします*1。
Octave の使い方としてはちょっとギミックですが、これでやってみよう。
*1:書き手がクローズしてしまうと、誰かが再オープンしてもダメみたい。