アフィリエイト広告を利用しています

広告

posted by fanblog

Perl - 名前付きPipeでメッセージを受け取る時の注意

殆どメモなんですが、Xbeeの制御コードをPerlで書いているせいで、問題が起きましたのでその対応策を書いておきます。

以下のようにPerlで名前付きPipeでメッセージを待つと、 CPUパワーの殆どを吸い取られます 。topコマンドで確認すると、80-90%近くPerlに使われます。



open FIFO, $fifoPath or die $!;

while(my $msg=< FIFO >){

}


なので、< FIFO > が空の状態の時はCPUバワーが食わないような待ち方をしないといけません。

ちなみに、 Rubyで以下のようなコードを書いても問題ありません。
Ruby側でちゃんとブロックしてくれます。


fifo=open(@fifoPath,"r+")
loop{
msg=fifo.gets

色々調べましたが、以下のように Selectを使って待ち、一回読み込んだらその都度Closeしないといけないみたいです。
そうしないと、次回からはselectで0byteリードが効いてブロックがかからないみたいです。


while(1){
open FIFO, $fifoPath or die $!;
my $read_bits = '';
vec($read_bits,fileno(FIFO),1) = 1;
select($read_bits, undef, undef, undef);

while(my $msg=< FIFO >){

}
close FIFO;
}


ちなみに、以下のようにFile::Tailも試してみましたが、$fifo->readの内部でエラーが発生して使えませんでした。。

use File::Tail;
$fifo=File::Tail->new($fifoPath);
while (defined($msg=$fifo->read)) {

}

タグ: Perl Pipe

この記事へのコメント

×

この広告は30日以上新しい記事の更新がないブログに表示されております。

Build a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: