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(...)'wx'て、入力が fifo に順次書き込まれるようにしています。たとえば、10 個のリクエストが同時に入ってきた場合など、すべてが同時に fifo に書き込まれるわけではありません。

4

1 に答える 1

2

'x'あなたが思うようにはしません。ノードのドキュメントから:

排他モード ( O_EXCL) は、パスが新しく作成されることを保証します。fs.open()その名前のファイルが既に存在する場合、失敗します。

排他性が必要と思われる状況はどのようなものですか? Nodejs はシングル スレッドであるため、2 つのfs.write呼び出しがインターリーブされることはありません。最初に呼び出された方が先に書き込みます。

于 2012-10-24T04:43:22.927 に答える