将类型化数组写入子进程stdin是不能正常工作的

时间:2018-06-18 12:56:06

标签: c++ node.js stream stdout stdin

我将一些数据发送到子进程的stdin。数据来自类型化数组。如果更改了类型化数组中的数据,则会截断发送到子进程的内容。我是一个显示此问题的小例子。

Subprocess是一个简单的C ++应用程序。从stdin读取所有数据并将读取的字节数输出到stdout。 (C ++ App使用x86_64-w64-mingw32-g ++ test.cpp编译)c ++中子进程的代码:

#include <iostream>
#include <limits>

int main(int argc, char **args) {
  std::cin.ignore(std::numeric_limits<std::streamsize>::max());
  std::cout << std::cin.gcount() << std::flush;
  return 0;
}

nodejs App将调用循环exe。将128字节的数据传递给stdin,并检查响应(来自子进程的stdout)是否为String&#34; 128&#34;。 nodejs App的代码:

const execFile = require('child_process').execFile;

var data = new Float64Array(16);

var generateError = true;
generateError && setInterval(_ => {
  for (var i = 0; i < 16; i++) {
    data[i] = Math.random();
  }
}, 1);

setInterval(_ => {
  var subproc = execFile('a.exe', [ '-c' ], (error, stdout, stderr) => {
    if (stdout.trim() !== '128' || error) {
      console.log('ERR: ' + stdout);
    } else {
      console.log('OK');
    }
  });
  subproc.stdin.write(Buffer.from(data.buffer)) || console.log('Use drain'); // Write Binary Data (128Byte)
  subproc.stdin.end();
}, 100);

这给了我一些输出:

OK
OK
OK
OK
OK
OK
ERR: 69
ERR: 114
OK
OK
OK
ERR: 41
是什么让我发疯:

  • 当我将generateError设置为false时,一切都按预期工作。
  • 当我使用&#34; wc.exe -c&#34; (来自cgywin的Word / Bytecount工具)一切都按预期工作,即使generateError设置为true。

所以问题:什么错了? C ++代码?节点代码?在将缓冲区传递给subproc.stdin.write后是否不允许更改缓冲区?如果不允许:为什么使用wc.exe运行变体?

1 个答案:

答案 0 :(得分:0)

在Windows下,有不同类型的流:二进制流和一些类型的文本流。将c ++ App的输入流更改为二进制流将解决该问题。 (我想wc.exe会将输入流用作二进制流。这可以解释为什么带有wc.exe的变体正在工作):

#include <iostream>
#include <limits>

#include <fcntl.h>
#include <io.h>
int main(int argc, char **args) {
  _setmode(_fileno(stdin), _O_BINARY);

  std::cin.ignore(std::numeric_limits<std::streamsize>::max());
  std::cout << std::cin.gcount() << std::flush;
  return 0;
}

另见Read binary data from std::cin