我拼凑了一个简单的C++应用程序,它将HID密钥代码从/DEV/INPUT/EXCEL[X]转储到Linux上的命名管道上。它可以很好地登录到控制台,但是当我从node.js应用程序中读取命名管道时,它会随机错过数据事件。
相关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++上正确地冲洗管道,或者我需要在No.js侧调整一些读油门。有什么想法吗?
最佳答案
有几个错误:
语句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());