考虑下面的C程序(test.c的):
#include <stdio.h>
int main() {
printf("string out 1\n");
fprintf(stderr, "string err 1\n");
getchar();
printf("string out 2\n");
fprintf(stderr, "string err 2\n");
fclose(stdout);
}
这应该打印一行到标准输出,一行标准错误,然后等待用户输入,然后另一条线路stdout和另一条线路标准错误。 非常基本的! 当编译并在命令行上运行该程序的输出时(被接收的用户输入对的getchar())完成:
$ ./test
string out 1
string err 1
string out 2
string err 2
当试图产卵此程序使用具有的NodeJS下面的代码一个子进程:
var TEST_EXEC = './test';
var spawn = require('child_process').spawn;
var test = spawn(TEST_EXEC);
test.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
test.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
// Simulate entering data for getchar() after 1 second
setTimeout(function() {
test.stdin.write('\n');
}, 1000);
输出显示如下:
$ nodejs test.js
stderr: string err 1
stdout: string out 1
string out 2
stderr: string err 2
从输出非常不同运行在终端./test时所见。 这是因为当通过催生的NodeJS的./test程序没有在交互shell中运行。 有test1.c标准输出流被缓冲并且在终端中,一旦一个\ n为达到缓冲器运行时被刷新但以这种方式与节点催生当缓冲器是不刷新。 这可以通过两种冲洗标准输出每次打印后加以解决,或者改变标准输出流,因此会立即刷新一切是无缓冲。 假设test.c的源不可用或修改,都不提到的两个冲洗选项可以被实现。
然后我就开始寻找模拟交互的shell,有它做得很好,例如pty.js(伪终端):
var spawn = require('pty.js').spawn;
var test = spawn(TEST_EXEC);
test.on('data', function (data) {
console.log('data: ' + data);
});
// Simulate entering data for getchar() after 1 second
setTimeout(function() {
test.write('\n');
}, 1000);
其输出:
$ nodejs test.js
data: string out 1
string err 1
data:
data: string out 2
string err 2
然而stdout和标准错误被合并在一起,我不能想办法把数据从流分开(如你在终端运行时程序见)。
所以,问题..
有没有使用到的NodeJS实现输出,而无需修改代码test.c的运行./test时所看到的任何方式? 或者通过终端仿真或过程产卵或任何其他方法?
干杯!