4

node.js を使用し、/dev/tty ファイルを開いてシリアル ポートから入力を読み取ります。コマンドを送信し、コマンドの結果を読み取ります。すべてのデータを読み取って解析したら、ストリームを閉じたいと思います。 . データマーカーの終わりまでにデータの読み取りが完了したことを知っています。ストリームを閉じると、プログラムが終了しないことがわかりました。

以下は、私が見ているものの例ですが、 /dev/random を使用してゆっくりとデータを生成しています (システムがあまり機能していないと仮定します)。私が見つけたのは、ストリームが閉じられた後にデバイスがデータを生成すると、プロセスが終了することです。

var util = require('util'),
    PassThrough = require('stream').PassThrough,
    fs = require('fs');

// If the system is not doing enough to fill the entropy pool
// /dev/random will not return much data.  Feed the entropy pool with :
//  ssh <host> 'cat /dev/urandom' > /dev/urandom
var readStream = fs.createReadStream('/dev/random');
var pt = new PassThrough();

pt.on('data', function (data) {
    console.log(data)
    console.log('closing');
    readStream.close();  //expect the process to terminate immediately
});

readStream.pipe(pt);

更新:1

この問題に戻って、別のサンプルがあります。これは pty を使用するだけで、ノード repl で簡単に再現できます。2 つの端末にログインし、以下の createReadStream の呼び出しでノードを実行していない端末の pty を使用します。

var fs = require('fs');
var rs = fs.createReadStream('/dev/pts/1'); // a pty that is allocated in another terminal by my user
//wait just a second, don't copy and paste everything at once
process.exit(0);

この時点でノードはハングアップし、終了しません。これは10.28にあります。

4

2 に答える 2

1

使用する代わりに

readStream.close(), 

使ってみて

readStream.pause().

ただし、ノードの最新バージョンを使用している場合は、次のように、isaacs によってストリームモジュールから作成されたオブジェクトで readstream をラップします。

var Readable = require('stream').Readable;
var myReader = new Readable().wrap(readStream);

その後、readStream の代わりに myReader を使用します。

頑張ってください!これが機能するかどうか教えてください。

于 2013-11-18T11:56:55.987 に答える
0

ストリームを閉じて/dev/randomいますが、パススルーのイベントのリスナーがまだあります'data'。これにより、パススルーが閉じられるまでアプリが実行され続けます。

読み取りストリームからバッファリングされたデータがいくつかあると推測しています。それがフラッシュされるまで、パススルーは閉じられません。しかし、これは単なる推測です。

目的の動作を得るには、次のようにパススルーのイベント リスナーを削除できます。

pt.on('data', function (data) {
  console.log(data)
  console.log('closing');

  pt.removeAllListeners('data');
  readStream.close();
});
于 2013-11-14T15:39:58.863 に答える