1

每当有 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(...)with'wx'标志来确保输入被顺序写入 fifo,例如当 10 个请求同时进入时,所以它们不会同时写入 fifo。

4

1 回答 1

2

'x'不按你的想法做。从节点文档

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

您认为需要排他性的情况是什么?Nodejs 是单线程的,所以两个fs.write调用永远不可能交错,先出现的先写。

于 2012-10-24T04:43:22.927 回答