2012-01-26 16 views
1

をファイルに書き込むとき、私は次のNode.jsコードを持っているハング:Node.jsのFIFO - プロセスが記述

var fs=require('fs'); 
var util=require('util'); 

var n2c=fs.createReadStream('./n2c'); 
var c2n=fs.createReadStream('./c2n'); 

n2c.on('data', function(b){ 
     util.puts(b); 
}); 
c2n.on('data',function(b){ 
     util.puts(b); 
}); 

あなたが見ることができるように、私は2つのFIFOファイルディスクリプタ(使用して作成した:、mkfifo n2cmkfifo c2nchmod 777 n2c c2n

別のウィンドウでecho "Hello" > n2cを実行すると、「こんにちは」が正常に表示されます。しかし、私がもう一度やり直そうとすると、echo "Hello" > n2cがハングアップし、node.jsウィンドウに何も表示されません。

これを修正するにはどうすればよいですか?私は、node.jsのwindow ad-infinitumに "Hello"をエコーすることができるようにしたい。

助けてください!

答えて

3

エコーが終了するとfifoは 'ファイル'の最後にヒットしますので、readstreamは 'end'イベントを出力し、読み込みストリームはファイル記述子を閉じ、より多くのものを受け付けなくなりますデータ。

fifoの両端に2つの長寿命プロセスがある場合は、問題はありませんが、エコーが書き込みされてから閉じられるため、ノードストリームはすぐに停止します。

現在のストリームが終了するたびにストリームを再作成することをお勧めします。

良い方法があるかどうかわかりません。ここで

+0

こんにちは、その洞察に感謝します。 Node.jsプログラムとCプログラムの間で通信するために、代わりにUnixソケットを使用するつもりだと思います。 – Eamorr

3

は、端末を使用してストリームをテストする簡単な方法です:

$ cat > n2c 
    Here you can type stuff 
    that will be streamed whenever you add a 
    newline. 
    You can send EOF (end of file) by 
    pressing Ctrl+D. 

ストリームはあなたが返すよう、各ラインのノードを提供し、あなたはCtrlキー+ Dを行うまで、切断したり、そうでない場合は送信されませんEOF文字。

echoが1行後に死亡する理由は、入力した内容の後で自動的にEOFを送信するためです。

答えはおそらく少し遅れますが、他の人には分かりやすいかもしれません。