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

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
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)) {

}

   
検索
検索語句
記事ランキング
最新記事
×

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