我将一些数据发送到子进程的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时,一切都按预期工作。wc.exe -c
&#34; (来自cgywin的Word / Bytecount工具)一切都按预期工作,即使generateError设置为true。所以问题:什么错了? C ++代码?节点代码?在将缓冲区传递给subproc.stdin.write
后是否不允许更改缓冲区?如果不允许:为什么使用wc.exe运行变体?
答案 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;
}