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:書き手がクローズしてしまうと、誰かが再オープンしてもダメみたい。