c++ - 从 node.js 中的 C++ 命名管道读取时缺少数据

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

我拼凑了一个简单的 C++ 应用程序,它将 HID 键码从/dev/input/event[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++ 端正确地刷新了管道,或者有某种形式读取限制我需要在 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());

关于c++ - 从 node.js 中的 C++ 命名管道读取时缺少数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46409192/

相关文章:

node.js - 如何在 Hogan js 中使用带有 for 循环的 if 语句

linux - 如何获得树可视化?

linux - Docker 容器中运行多个 httpd 进程

嵌套模板类的 C++ 非成员函数

c++ - std::regex_replace 仅第一次出现

javascript - 在discord.js 中添加日期时间描述

python - 如何使用 ansi 转义码为 python 中的特定字符单元着色,其中字符单元位置由变量确定

c++ - 有没有直接快速的方法将 "map"list<VectorXd> 转换为 MatrixXd?

c++ - 返回值的简单模板类成员函数特化

javascript - Azure Function App jsreport on HTTP 触发器不起作用