2012-10-24 193 views
0

我试图在我的node.js服务器中写入一个fifo,只要有web请求进来。我将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个请求同时进入时,所以他们并不全部同时写入FIFO。

回答

1

'x'不符合您的想法。从Node docs

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

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

+0

我明白了,谢谢你指出独家模式。 至于fs.write是交错的,如果两个web请求同时进入,fs.open(...)不会被调用两次?然后他们每个人都会调用'fs.write(...)'这可能会同时运行,因为'fs.write(...)'调用是异步的。还是有我失踪的东西?你是说fs.open()只能处理一个请求,并且在写入时,另一个请求无法打开文件? – Addison