2017-12-05 19 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

다른 쪽에서 이미 끝난 상태에서 stind 스트림을'.end()'하기 때문에 그렇지 않습니까? – n00dl3

답변

0

EPIPE 쓰기 오류는 아무도 읽을 수없는 파이프에 누군가 쓰고 있음을 의미합니다.

또한이 오류는 아무도 처리하지 않는 컨텍스트에서 발생하므로 프로세스에 치명적인 오류입니다. 슬프게도, 노드는 어떤 스트림인지 식별 ​​할 수있는 좋은 일을하지는 않지만, 코드에서 코드가 무엇인지를 추측 할 수 있습니다.이 코드에 의해 쓰여지는 스트림은 하나뿐입니다 ...

test.stdin.on('error', (...args) => { console.log('stdin err', args); });

오류가 "처리됨"(잘못 처리됨)되고 프로세스가 계속 진행되므로 적어도 오류의 출처를 알 수 있습니다.

특히 test.stdin.write('q')q을 처리의 표준 입력란에 쓰고 있습니다. 하지만 자녀 과정은 ls입니다. 그것은 stdin에 아무것도 허용하지 않으므로 stdin을 닫습니다. 따라서 부모는 부모가 현재 닫힌 파이프에 쓰기를 시도 할 때 EPIPE 오류를 다시 보냅니다. 그러니 그만하십시오.

당신은 아마 당신이 대화 형으로 ls를 입력 할 때와 동일하게 동작하도록 ls을 기대하지만, 아마 (나는 당신이 대화 형 ls 호출기를 통해 것입니다, 당신은 당신이 호출기를 종료 할 필요가 기다리고있어 의심?) 않습니다 이 하위 프로세스는 대화식으로 /bin/ls을 실행하는 것과 같습니다.