2016-10-27 2 views
1

Когда я запускаю это в Баш:Почему открытие трубы fifo в блоке узла child_process.exec?

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

Это может быть ошибка в вашей операционной системе или только в старой версии Узел. Работает для меня на Mac с узлом 4. Сотрудник смог запустить его на Debian, но только после того, как он обновился до узла 8.

0

Именно так работают трубы (называемые или анонимные). Писатель будет блокироваться, пока на другом конце не появится читатель, и читатель будет блокировать без писателя. Можно сказать, что это фундаментальный принцип.

Вот небольшая демонстрация, которую вы можете сделать в командной строке. Вам понадобятся две терминальные сессии, я буду называть их А и Б.

На A:

mkfifo mypipe 
ls > mypipe 

Сеанс будет блокировать. В настоящее время на сессии B:

cat mypipe 

Это должно отображать ls выход и разблокированию сеанса А.

Вы также можете попробовать это, выполнив cat первым.

+0

Да, я понимаю, что трубы блокируют запись, пока другой процесс не откроет трубу для чтения, но здесь есть две вещи: 1) Node.js обычно использует неблокирующий интерфейс, а childProcess.exec не должен блокировать 2) Процесс даже не блокирует открытый вызов в трубе. –

Смежные вопросы