gpt4 book ai didi

javascript - NodeJS child_process stdout,如果进程正在等待 stdin

转载 作者:行者123 更新时间:2023-12-05 03:36:10 26 4
gpt4 key购买 nike

我正在开发一个应用程序,它允许编译和执行通过 api 提供的代码。

我要执行的二进制文件保存为 input_c 并且应该打印一个文本,询问用户的姓名并在收到输入后打印出另一个文本。

使用以下代码可以正常工作:第一个文本 - 输入(在终端上) - 第二个文本。

const {spawn} = require('child_process');
let cmd = spawn('input_c', [], {stdio: [process.stdin, process.stdout, process.stderr]});

输出:

$ node test.js
Hello, what is your name? Heinz
Hi Heinz, nice to meet you!

我喜欢单独处理 stdout、stderr 和 stdin,而不是将其写入终端。以下代码是我尝试实现与上述相同的行为:

const {spawn} = require('child_process');

let cmd = spawn('input_c');

cmd.stdout.on('data', data => {
console.log(data.toString());
});

cmd.stderr.on('data', data => {
console.log(data.toString());
});

cmd.on('error', data => {
console.log(data.toString());
});

// simulating user input
setTimeout(function() {
console.log('Heinz');
cmd.stdin.write('Heinz\n');
}, 3000);

输出:

$ node test.js
Heinz
Hello, what is your name? Hi Heinz, nice to meet you!

为了模拟用户输入,我在 3000 毫秒后写入标准输入。但是这里我并没有在运行时直接在 stdout 中接收到第一个数据,它似乎在等待 stdin 并立即输出所有内容。

我怎样才能为我的第二种情况实现相同的行为?

以下 C 代码用于编译二进制文件,但任何等待用户输入的应用程序都可用于此目的:

#include <stdio.h>

int main() {
char name[32];
printf("Hello, what is your name? ");
scanf("%s", name);
printf("Hi %s, nice to meet you!", name);
return 0;
}

最佳答案

node-pty可以在这里用来防止子进程的缓冲输出。

const pty = require('node-pty');

let cmd = pty.spawn('./input_c');

cmd.on('data', data => {
console.log(data.toString());
});

// simulating user input
setTimeout(function() {
console.log('Heinz');
cmd.write('Heinz\n');
}, 3000);

输出:

Hello, what is your name?
Heinz
Heinz
Hi Heinz, nice to meet you!

关于javascript - NodeJS child_process stdout,如果进程正在等待 stdin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69698871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com