2016-10-27 11 views
1

나는 떠들썩한 파티에서이 프로그램을 실행할 때 :노드 블록 child_process.exec에서 fifo 파이프를 여는 이유는 무엇입니까?

mkfifo im-a-pipe && node -e ' 
var fs = require("fs") 
var childProcess = require("child_process") 

console.log("pre-open") 
fs.open("im-a-pipe", "w", function(err, fd){ 
if(err) 
throw err 
console.log("opened") 
}) 
console.log("post-open") 
childProcess.exec("echo wat") 
console.log("YOU CAN NOT SEE MEEE") 
' 

나는 다음과 같은 출력 예상 : 처음 두 행를 인쇄 한 후

pre-open 
post-open 
YOU CAN NOT SEE MEEE 

하지만 그 대신 노드 대기 : 나는

pre-open 
post-open 

해요 아마도 뭔가가 다른면을 열 때까지 파이프가 막히는 것과 관련이 있다고 생각하지만이 동작은 나를 놀라게합니다.

나는이 기능들이 어떻게 작동 할 것으로 생각 되나?

답변

1

운영 체제의 버그이거나 이전 버전의 노드 일 수 있습니다. 노드 4로 Mac에서 작동합니다. 동료가 노드 8로 업그레이드 할 때까지 데비안에서 실행할 수 있었지만 노드 8로 업그레이드하지 않았습니다.

0

정확히 파이프가 작동하는 방식입니다 (명명 된 또는 익명). 작가는 다른 쪽 끝에 독자가있을 때까지 차단할 것이며, 독자는 작가없이 차단할 것입니다. 당신은 이것이 기본 원칙이라고 말할 수 있습니다.

다음은 명령 줄에서 수행 할 수있는 간단한 데모입니다. 당신은 두 개의 터미널 세션이 필요합니다 나는에 A와 B

를 호출 할 수 있습니다 :

mkfifo mypipe 
ls > mypipe 

세션 A는 차단합니다. 이제 세션 B에 :

cat mypipe 

세션 A.

ls 출력을 표시하고 차단을 해제해야한다 또한 cat 첫째을 수행하여이 작업을 시도 할 수 있습니다.

+0

네, 다른 프로세스가 읽기 위해 파이프를 열 때까지 파이프가 작성자를 차단한다는 것을 이해합니다. 하지만 여기서는 두 가지가 진행 중입니다. 1) Node.js는 일반적으로 논 블로킹 인터페이스를 사용하고 childProcess.exec는 차단해서는 안됩니다. 2) 프로세스는 파이프에 대한 호출을 차단하지 않습니다. –