2017-09-25 96 views
0

我拼湊了一個簡單的C++應用程序,該應用程序將HID密碼從/ dev/input/event [x]轉儲到Linux上的命名管道。它很好地登錄到控制檯,但是當我從node.js應用程序讀取命名管道時,它會隨機丟失數據事件。從node.js中的C++命名管道讀取時缺少數據

相關的C++代碼:

int fd; 
char * myfifo = "/tmp/testfifo"; 
mkfifo(myfifo, 0660); 
fd = open(myfifo, O_WRONLY); 

while (1){ 

    value = ev[0].value; 

    if (value != ' ' && ev[1].value == 1 && ev[1].type == 1) { 

     string s = to_string(ev[1].code); 
     char const *sop = (s + "\n").c_str(); 

     cout << sop; 
     write(fd, sop, sizeof(sop)); 
    } 
} 

相關的Node.js代碼:

var fifo = '/tmp/testfifo';  
var fd = fs.openSync(fifo, 'r+'); 

fs.createReadStream(null, {fd:fd}).on('data', function (d) { 
    console.log(d); 
}); 

我猜我的方法讀取命名管道是有缺陷的,因爲C++輸出看起來不錯,但我知道,幾乎沒有任何關於C++的知識,所以我不確定我是否正確地在C++端刷新了管道,或者存在某種讀取節流,我需要調整node.js端。有任何想法嗎?

+0

檢查的'fd'在C++代碼的值。 –

+0

價值看起來不錯。我認爲這肯定是在node.js方面,因爲當我使用spawn尾部相同的管道,它很好。很有意思。 –

+0

這個javascript適用於我,即使使用簡單的'fs.createReadStream('/ tmp/testfifo')。on(...)''。 –

回答

1

一對夫婦的錯誤:

  • 聲明char const *sop = (s + "\n").c_str();產生懸掛引用,因爲聲明進行了評估後(s + "\n")產生的臨時字符串被破壞。
  • write(fd, sop, sizeof(sop));寫入sizeof(char const*)字節,而它應該寫入strlen(sop)字節。

甲修正:

std::string sop = s + "\n"; 
write(fd, sop.data(), sop.size()); 
+0

謝謝你的回覆。不幸的是,這種改變沒有任何效果。 –