繁体   English   中英

Node.js写入子进程

[英]Node.js write to child process

我正在尝试使用child_process模块和树莓child_process的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()

有人知道该怎么办,直到完成所有操作后,创建的写入流才会关闭?

当然,我仍然在Google上搜索过此内容:

Child_process抛出错误:写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

请帮忙!

EPIPE写入错误表示有人正在写入管道,没人会读取。

此外,由于此错误是在没有人处理的情况下引发的,因此该错误对于您的过程是致命的。 可悲的是,node并不能很好地识别哪个流,但是我们可以猜测它在您的代码中,并且此代码仅写入了一个流...

如果添加错误处理程序,则可以验证错误是否来自“ stdin”流: test.stdin.on('error', (...args) => { console.log('stdin err', args); });

现在将“处理”(较差)错误,并且该过程将继续进行,因此您至少知道错误从何而来。

具体来说,此test.stdin.write('q')正在将q写入进程的标准输入。 但是您的子进程是ls 它在stdin上不接受任何内容,因此关闭了stdin。 因此,当父级尝试写入现在关闭的管道时,操作系统会发回EPIPE错误。 因此,停止这样做。

您可能希望ls的行为与您以交互方式键入ls时的行为相同,但可能不会(我怀疑您的交互式ls正在通过传呼机,并且您期望您需要退出该传呼机?)此子进程是更相当于以交互方式运行/bin/ls

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM