【问题标题】:How to pass stream input/output between a main process and a child process in Node.js如何在 Node.js 中的主进程和子进程之间传递流输入/输出
【发布时间】:2019-10-12 07:22:46
【问题描述】:

我正在尝试让两个进程通过stdio 相互“对话”:

ping.js

import { readline } from '../readline';
import { sleep } from '../sleep';
import { spawn } from 'child_process';

const spawnPongProcess = () => {
    const child = spawn('node',
        ['-r', 'esm', `${__dirname}/pong.js`],
        { stdio: 'pipe' });

    child.stderr.on('data', (data) => {
        console.error(`stderr: ${data}`);
    });

    child.on('close', (code) => {
        console.error(`child process exited with code ${code}`);
        process.stdin.resume();
        process.stdout.resume();
    });

    child.on('error', (err) => {
        console.error(`child process error: ${err}`);
    });

    process.stdout.pipe(child.stdin);
    child.stdout.pipe(process.stdin);

    return child;
};

export const ping = async () => {
    const child = spawnPongProcess();

    await sleep(1000);

    console.log('ping');

    let pong = readline();

    console.error(`Ping received: ${pong}`);

    child.kill();
};

我通过管道将父进程 stdout 传递给子进程 stdin,并将子进程 stdout 传递给父进程 stdin,以允许进程通过 stdio 进行通信。

pong.js

import { readline } from '../readline';
import { sleep } from '../sleep';

const pong = async () => {

    console.log(`Pong initiated and waiting for input.`);

    let ping = readline();

    console.log(`Pong received: ${ping}`);

    process.exit();
};

pong();

readline.js

import { question } from 'readline-sync';

export const readline = question;

sleep.js

export const sleep = (ms) => {
    return new Promise((resolve) => setTimeout(resolve, ms));
};

输出是:

$ node -r esm src/index.js
Pong initiated and waiting for input.
ping

父进程 (ping) 的输出似乎没有传递到子进程 (pong)。关于如何使其工作的任何想法?

【问题讨论】:

    标签: javascript node.js stdio


    【解决方案1】:

    您将进程的stdout(可写)通过管道传输到子进程的stdin(可写),反之亦然。由于在stdin(可读)上接收到数据,因此您必须通过管道而不是stdout

    process.stdin.pipe(child.stdin);
    child.stdout.pipe(process.stdout);
    

    您的代码不会抛出异常,因为如果标准输出是终端,它就会变成双工流。

    【讨论】:

    • 知道了,但我仍然遇到同样的问题:Pong initiated and waiting for input. ping ^C 在它挂起等待输入后我按cntrl+c
    • @Kiril 这是一个简化的复制:gist.github.com/laggingreflex/6ba11dcae7624c00a2c2b29250c4b80c。运行ping.js 并输入几行
    • 谢谢。当我使用流事件时,我得到了相同的结果(和你一样),但我的目标是使用readline_sync。不知何故,它没有像我预期的那样工作。我想我会继续挖掘。
    猜你喜欢
    • 2012-04-29
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2015-03-21
    相关资源
    最近更新 更多