我尝试使用child_process
模块和覆盆子pi上的mpg123播放器在node.js中创建一个mp3 webradio。
问题在于: 当我尝试写入流时,我总是得到一个错误:
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 :(得分:0)
EPIPE
写入错误意味着有人正在写入一个人们无法读取的管道。
此外,因为在没有人处理它的情况下引发此错误,所以错误对于您的进程来说是致命的。遗憾的是,node并没有很好地识别哪个流,但是我们可以在你的代码中猜测它,而且这个代码只写了一个流......
如果添加错误处理程序,则可以验证错误是来自“stdin”流:
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
。