从node.js中的C++命名管道读取时缺少数据
问题描述:
我拼凑了一个简单的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端。有任何想法吗?
答
一对夫妇的错误:
- 声明
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
谢谢你的回复。不幸的是,这种改变没有任何效果。 –
检查的'fd'在C++代码的值。 –
价值看起来不错。我认为这肯定是在node.js方面,因为当我使用spawn尾部相同的管道,它很好。很有意思。 –
这个javascript适用于我,即使使用简单的'fs.createReadStream('/ tmp/testfifo')。on(...)''。 –