Node.js FIFO - процесс зависает при записи в дескриптор файла - PullRequest
1 голос
/ 26 января 2012

У меня есть следующий код Node.js:

var fs=require('fs');
var util=require('util');

var n2c=fs.createReadStream('./n2c');
var c2n=fs.createReadStream('./c2n');

n2c.on('data', function(b){
        util.puts(b);
});
c2n.on('data',function(b){
        util.puts(b);
});

Как видите, у меня есть два дескриптора файла FIFO (созданные с использованием: mkfifo n2c, mkfifo c2n, chmod 777 n2c c2n)

Когда я делаю echo "Hello" > n2c в другом окне, «Hello» подходит нормально. Но когда я пытаюсь сделать это снова, echo "Hello" > n2c зависает и ничего не появляется в окне node.js.

Как мне это исправить? Я хочу быть в состоянии повторить "Hello" в бесконечном окне window.js.

Пожалуйста, помогите!

Ответы [ 2 ]

4 голосов
/ 05 января 2013

Вот простой способ проверить ваш поток с помощью терминала:

$ cat > n2c
  Here you can type stuff
  that will be streamed whenever you add a
  newline.
  You can send EOF (end of file) by
  pressing Ctrl+D.

Поток будет предоставлять узлу каждую строку при возврате и не будет обрезаться, пока вы не нажмете Ctrl + D или не отправите символ EOF иным способом.

Причина, по которой ваш echo умирает после одной строки, заключается в том, что он автоматически отправляет EOF после всего, что вы вводите.

Ответ, вероятно, немного запоздал, но может быть полезным для других.

3 голосов
/ 26 января 2012

Проблема заключается в том, что при выходе из echo fifo достигнет конца файла, поэтому ваш поток чтения выдаст событие end, а поток чтения закроет дескриптор файла и больше не будет принимать больше данных..

Если у вас есть два долгоживущих процесса на обоих концах, если есть fifo, то это не будет проблемой, но поскольку echo записывает, а затем закрывается, он быстро останавливает поток узлов.

Ваш лучший вариант, вероятно, состоит в том, чтобы просто заново создать поток всякий раз, когда текущий поток запускает 'end'.

Не уверен, что есть лучший способ.

...