在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中输入东西需要怎么做啊……
    }
);

6 回复

要在Node.js中向通过spawnexec生成的子进程中写入数据到stdin,你可以使用process.stdin流。下面是关于如何向spawnexec生成的子进程中写入数据到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脚本的相同目录下,或者提供正确的路径。

通过上述方法,你可以向通过spawnexec生成的子进程中写入数据到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中向spawnexec创建的子进程中写入数据到其标准输入(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();

解释

  • spawnexec 都是 Node.js 中用于创建子进程的方法。
  • stdio: ['pipe', 'pipe', 'pipe'] 表示为子进程的标准输入、输出和错误分别设置管道。这使得你可以通过 .stdin 属性来访问子进程的标准输入流。
  • childProcess.stdin.write() 方法用来向子进程的 stdin 写入数据。
  • childProcess.stdin.end() 用于结束对子进程的标准输入流的写入。

上述代码片段适用于任何需要通过 stdin 提供输入的程序。你需要将 'your_program_name' 替换为实际要执行的可执行文件名,并根据实际情况调整命令行参数。

回到顶部