从node.js中的C ++命名管道读取时丢失数据

时间:2017-09-25 15:44:58

标签: c++ node.js linux named-pipes

我拼凑了一个简单的C ++应用程序,它将/ dev / input / event [x]中的HID密钥代码转储到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 ++端正确冲洗管道或者有某种类型读取油门我需要在node.js侧调整。有什么想法吗?

1 个答案:

答案 0 :(得分: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());