将类型化数组写入子进程 stdin 无法正常工作



>我正在将一些数据发送到子进程的stdin。数据来自类型化数组。如果类型化数组中的数据发生更改,则发送到子进程将被截断。我有一个小例子来说明这个问题。

子进程是一个简单的C++应用程序,从标准输出读取所有数据并将读取字节数输出到标准输出。(C++ 应用程序是用x86_64-w64-mingw32-g++测试编译的.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 应用程序将调用循环的 exe。将 128 字节的数据传递给 stdin,并检查响应(来自子进程的 stdout(是否为字符串"128"。nodejs 应用程序的代码:

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 时,一切都按预期工作。
  • 当我使用"wc.exe -c"(来自cgywin的单词/字节计数工具(时,一切都按预期工作,即使生成错误设置为true也是如此。

那么问题来了:怎么了?C++代码?节点代码?是否不允许在将缓冲区传递给subproc.stdin.write后更改缓冲区?如果不允许:为什么将变体与 wc.exe一起使用?

在Windows下有不同类型的流:二进制流和某些类型的文本流。将 c++ 应用程序的输入流更改为二进制流将解决此问题。(我猜 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;
}

另请参阅从 std::cin 读取二进制数据

最新更新