2017-09-25 12 views
0

Linux上の/ dev/input/event [x]からHIDキーコードを名前付きパイプにダンプする簡単なC++アプリケーションを一緒に書きました。それはコンソールにうまくログを記録しますが、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(...)'であっても、私にとっては役に立ちます。 –

答えて

1

エラーのカップル:文が評価された後(s + "\n")によって生成一時的な文字列が破壊されますので

  • 声明char const *sop = (s + "\n").c_str();はダングリング参照を生成します。
  • write(fd, sop, sizeof(sop));は、sizeof(char const*)バイトを書き込みますが、strlen(sop)バイトを書き込む必要があります。

修正:

std::string sop = s + "\n"; 
write(fd, sop.data(), sop.size()); 
+0

ありがとうございます。残念ながら、その変更は何の効果もありませんでした。 –

関連する問題