【发布时间】:2016-09-11 00:26:15
【问题描述】:
我的目标是将某些流程执行的会话保存到 json(类似[{ type: 'stdout', data: 'What's your name?' }, { type: 'stdin', data: 'Alex.' }, { type: 'stdout', data: 'Hi, Alex!' }])。我决定用 nodejs 来做,但我遇到了一些问题。生成进程的标准输出在通过管道传输和继承时的工作方式不同。所以,例如我有这个 C 代码(简单的猜数游戏)编译为main:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int random_num = 0;
int guessed_num = 0;
int counter = 0;
srand(time(NULL));
random_num = rand() % 10 + 1;
printf("Guess my number! ");
while(1) {
counter++;
scanf("%d", &guessed_num);
if (guessed_num == random_num) {
printf("You guessed correctly in %d tries! Congratulations!\n", counter);
break;
}
if (guessed_num < random_num)
printf("Your guess is too low. Guess again. ");
if (guessed_num > random_num)
printf("Your guess is too high. Guess again. ");
}
return 0;
}
还有这段 JavaScript 代码:
var spawn = require('child_process').spawn;
var child = spawn('./main', { stdio: 'inherited' });
这段 JavaScript 代码的执行结果是:
Guess my number! 1
Your guess is too low. Guess again. 2
Your guess is too low. Guess again. 3
You guessed correctly in 3 tries! Congratulations!
但是,当stdio 是inherited 时,我无法附加到任何流程流并将数据保存到 json。所以我尝试了这个:
var spawn = require('child_process').spawn;
var child = spawn('./main', { stdio: 'pipe' });
child.stdout.on('data', function(data) { process.stdout.write(data) });
process.stdin.on('data', function(data) { child.stdin.write(data) });
并作为执行的结果得到这个:
1
2
3
Guess my number! Your guess is too low. Guess again. Your guess is too low. Guess again. You guessed correctly in 3 tries! Congratulations!
当子进程等待输入时,子进程的标准输出以某种方式挂起。可能它与事件循环有关,但我不确定。反正inherited和pipe的行为是很不一样的,好像是不对的……
我能做些什么呢?也许有一些解决方法?
【问题讨论】:
标签: javascript c node.js unix