从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端。有任何想法吗?

+0

检查的'fd'在C++代码的值。 –

+0

价值看起来不错。我认为这肯定是在node.js方面,因为当我使用spawn尾部相同的管道,它很好。很有意思。 –

+0

这个javascript适用于我,即使使用简单的'fs.createReadStream('/ tmp/testfifo')。on(...)''。 –

一对夫妇的错误:

  • 声明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

谢谢你的回复。不幸的是,这种改变没有任何效果。 –