Запись в fifo из node.js

0 Addison [2012-10-24 06:23:00]

Я пытаюсь писать на fifo на моем сервере node.js всякий раз, когда приходит веб-запрос. Я использую fifo в качестве очереди задач, так что другая программа может читать и выполнять некоторую трудоемкую работу.

Пока у меня есть код для моего сервера node.js следующим образом:

fs = require('fs');

...

var fifoPath = '/tmp/myfifo';
var input = 'some input';
fs.open(fifoPath, 'wx', 0644, function(error, fd) {
  if (error) {
    if (fd) {
      fs.close(fd);
    }
    console.log('Error opening fifo: ' + error);
    return;
  }

  fs.write(fd, input, 0, input.length, null, function(error, written, buffer) {
    if (fd) {
      fs.close(fd);
    }
    if (error) {
      console.log('Error writing to fifo: ' + error);
    } else {
      if (written == input.length) {
        console.log('Input has been written successfully!';
      } else {
        console.log('Error: Only wrote ' + written + ' out of ' + input.length + ' bytes to fifo.');
      }
    }
  });
});

Когда этот код работает, он выводит следующее:

Error: EEXIST, open '/tmp/myfifo'

Я делаю это неправильно?

Примечание. Я использую fs.open(...) с флагами 'wx' чтобы убедиться, что вход записывается в fifo последовательно, например, когда одновременно поступает 10 запросов, поэтому они не все пишут в то же время.

javascript linux node.js fifo


1 ответ


1 loganfsmyth [2012-10-24 07:43:00]

'x' не делает то, что вы думаете. Из документов узла:

Эксклюзивный режим (O_EXCL) гарантирует, что путь будет создан. fs.open() терпит неудачу, если файл с таким именем уже существует.

Какова ситуация, когда вы считаете, что эксклюзивность необходима? Nodejs является однопоточным, поэтому невозможно, чтобы два fs.write чередуются, в зависимости от того, что наступит первым, напишет первым.