从node.js写入fifo

时间:2012-10-24 03:23:44

标签: javascript linux node.js fifo

每当Web请求进来时,我都会尝试在node.js服务器中写入fifo。我正在使用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个请求同时进入时,所以他们不会同时写入fifo。

1 个答案:

答案 0 :(得分:1)

'x'没有按你的想法行事。来自Node docs

独占模式(O_EXCL)确保新创建路径。如果已存在该名称的文件,fs.open()将失败。

您认为需要排他性的情况是什么? Nodejs是单线程的,因此两个fs.write调用永远不可能是交错的,无论哪个先出现都会先写入。