Запись в 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
чередуются, в зависимости от того, что наступит первым, напишет первым.