在Node.js中,怎么向spawn和exec产生的子进程的stdin输入东西??
在Node.js中,怎么向spawn和exec产生的子进程的stdin输入东西??
例如程序:
#include <stdio.h>
int main(){
int a,b;
while(scanf("%d %d", &a, &b)!=EOF)
printf("%d\n",a+b);
return 0;
}
然后通过
var exec = require('child_process').exec;
var childProcess = exec('a.out',
function(err, stdout, stderr){
//balabalabala
//我想向a.out的stdio中输入东西需要怎么做啊……
}
);
要在Node.js中向通过spawn
或exec
生成的子进程中写入数据到stdin
,你可以使用process.stdin
流。下面是关于如何向spawn
和exec
生成的子进程中写入数据到stdin
的详细说明和示例代码。
使用 spawn
spawn
方法允许你创建一个新的进程,并且可以更细粒度地控制标准输入、输出和错误流。以下是如何使用spawn
向子进程的stdin
写入数据的例子:
const { spawn } = require('child_process');
// 创建一个子进程,运行上面提供的C语言程序
const childProcess = spawn('./a.out', [], {
stdio: ['pipe', 'pipe', 'pipe']
});
// 向子进程的 stdin 写入数据
childProcess.stdin.write("5 3\n");
childProcess.stdin.end();
// 监听子进程的标准输出
childProcess.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
// 监听子进程的标准错误
childProcess.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
// 监听子进程结束事件
childProcess.on('close', (code) => {
console.log(`子进程退出,退出码 ${code}`);
});
使用 exec
exec
方法是更高层次的接口,用于执行命令并获取输出。它同样支持向stdin
写入数据,但方式略有不同:
const { exec } = require('child_process');
// 创建一个子进程,运行上面提供的C语言程序
exec('./a.out', (error, stdout, stderr) => {
if (error) {
console.error(`执行出错: ${error}`);
return;
}
// 向子进程的 stdin 写入数据
process.stdin.pipe(childProcess.stdin);
// 监听子进程的标准输出
console.log(`stdout: ${stdout}`);
// 监听子进程的标准错误
console.error(`stderr: ${stderr}`);
});
请注意,在实际应用中,你需要确保C程序a.out
已经编译并且可执行文件位于你的Node.js脚本的相同目录下,或者提供正确的路径。
通过上述方法,你可以向通过spawn
和exec
生成的子进程中写入数据到stdin
。
这样试试:
var spawn = require('child_process').spawn;
var proc = spawn('./a.out');
proc.stdout.pipe(process.stdout); // 把子进程的输出导向控制台
proc.stdin.write(‘2 4\n6 8\n’); // 写入数据
proc.stdin.end();
执行后,在控制台观察输出。
采用child_process的exec方法可以这样来写:
var exec = require('child_process').exec;
var child = exec('./a.out', function (err, stdout, stderr) {
console.log(stdout); // 直接查看输出
});
child.stdin.write(‘2 4\n6 8\n’); // 输入
child.stdin.end();
var exec = require('child_process').exec;
var ch = exec('./a.out');
process.stdin.pipe(ch.stdin); // 将父进程的stdin输入到子进程(c program)中
ch.stdout.pipe(process.stdout); // 将子进程的输出(stdout)输出到父进程的stdout中
ch.stderr.pipe(process.stdout); // 与上一个类似 不过是stderr
可以试着把最后两行pipe函数去掉,看看有什么结果 :)
exec也有stdin这些数据成员??这个主要是我疑惑的地方……
感觉就是通过重定向,把子进程包在了父进程中……等手边有环境了试试哈~多谢~
要在Node.js中向spawn
或exec
创建的子进程中写入数据到其标准输入(stdin),你可以使用相应的API来操作子进程的标准输入流。以下是具体示例:
使用 spawn
const { spawn } = require('child_process');
// 创建一个子进程执行外部程序
const childProcess = spawn('your_program_name', ['arg1', 'arg2'], {
stdio: ['pipe', 'pipe', 'pipe']
});
// 向子进程的标准输入(stdin)写入数据
childProcess.stdin.write("data to be written\n");
childProcess.stdin.end();
使用 exec
const { exec } = require('child_process');
// 创建一个子进程执行外部程序
const childProcess = exec('your_program_name arg1 arg2', {
stdio: ['pipe', 'pipe', 'pipe']
});
// 向子进程的标准输入(stdin)写入数据
childProcess.stdin.write("data to be written\n");
childProcess.stdin.end();
解释
spawn
和exec
都是 Node.js 中用于创建子进程的方法。stdio: ['pipe', 'pipe', 'pipe']
表示为子进程的标准输入、输出和错误分别设置管道。这使得你可以通过.stdin
属性来访问子进程的标准输入流。childProcess.stdin.write()
方法用来向子进程的 stdin 写入数据。childProcess.stdin.end()
用于结束对子进程的标准输入流的写入。
上述代码片段适用于任何需要通过 stdin 提供输入的程序。你需要将 'your_program_name'
替换为实际要执行的可执行文件名,并根据实际情况调整命令行参数。