2017-12-05 6 views
1

私はchild_processモジュールとラズベリーパイのmpg123プレーヤーを使ってnode.jsにmp3ウェブラジオを作りようとしています。Node.js子プロセスに書き込む

ここで問題です: 私はストリームに書き込みしようとすると、私は常にエラーを取得:

Error: write EPIPE 
at exports._errnoException (util.js:1026:11) 
at WriteWrap.afterWrite (net.js:795:14) 

ここで私はそれをテストしようとしたものです:

//create a subprocess 
var test = childProcess.exec('ls /home/pi/music'); 

//pipe all the output to the process output 
test.stdout.pipe(process.stdout); 
test.stderr.pipe(process.stderr); 

test.stdin.setEncoding('utf-8'); 

//here I just want to write a key to the subprocess 
test.stdin.write('q'); 
test.stdin.end() 

誰もが知っている、どのようなすべての操作が完了するまで、作成された書き込みストリームは閉じられませんか?

そしてもちろん、私はまだこれをグーグルで検索:

Child_process throw an Error: write EPIPE

https://github.com/nodejs/node/issues/2985

https://nodejs.org/api/child_process.html#child_process_subprocess_stdin

https://nodejs.org/api/stream.html#stream_writable_write_chunk_encoding_callback

助けてください!

+0

'ls/home/pi/music'の子プロセスは出力に何か書き込む前に終了しませんか? – dpetrini

+0

私はプロセス**が終了すると思います**これがエラーの原因です。しかし、私はこれを止める方法を知らない:c。 もしそれが止まらないなら、私はエラーを生成しないと思います... –

+0

もう片方の側で既に終了している間に、あなたが '.end()' stindストリームを持っているからですか? – n00dl3

答えて

0

EPIPE書き込みエラーは誰も誰も読まないパイプに書き込んでいることを意味します。

さらに、このエラーは誰も処理しないコンテキストで発生しているため、このエラーはプロセスにとって致命的です。悲しいことに、ノードはどのストリームを識別するのに良い仕事をしませんが、あなたのコードではそのコードが推測でき、このコードによって書き込まれるストリームは1つだけです...

このエラーあなたは、少なくともそのから来どこ知っているので、(悪い)今、エラーが「扱い」されます test.stdin.on('error', (...args) => { console.log('stdin err', args); });

、処理が続行されます:あなたはエラーハンドラを追加する場合は、「標準入力」の流れから来ています。

特にこのtest.stdin.write('q')は、処理の標準にqと書いています。しかし、あなたの子プロセスはlsです。 stdinは何も受け付けていないので、stdinを閉じます。親が今閉じたパイプに書き込もうとすると、OSはEPIPEエラーを返します。だから、やめてください。

は、あなたはおそらく、あなたが対話的にlsを入力したときと同じ動作をするlsを期待したが、それはおそらくない(私はあなたが対話lsページャを通過している、とあなたはそのページャを終了する必要があることを期待している疑いがある?)んこの子プロセスは、対話的に/bin/lsを実行することと同等です。

関連する問題