2012-10-24 192 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