消除对子流程数据的缓冲

时间:2019-01-16 19:51:01

标签: node.js parent-child child-process

我尝试通过node.js脚本(父级)创建一个子进程,这种方式不会对父级和子级数据流产生干扰。父进程仅在子进程启动并能够终止时才具有子进程ID。 child_process.exec满足了我的需要,但不幸的是,它缓冲了孩子的输出,因此当缓冲区装满后,孩子就会崩溃。有没有消除缓冲的方法?子进程本质上是无限的(数据流)。还是有其他方法可以实施这些控制措施?

代码示例(仅用于演示):

const { exec } = require('child_process');
const keypress = require('keypress');
keypress(process.stdin);

var c1;

process.stdin.on('keypress', (letter, key) => {
    if (key && key.name == 'a') {
        c1.kill();
    } else if (key && key.name == 'b') {
        c1 = exec('ffplay -i udp://localhost:4000', (err, stdout, stderr) => {
            if (err) {
                console.error(`error: ${err}`);
            }
        });
    }
});

我尝试过spawn,但是有孩子-父母的干扰甚至更严重

1 个答案:

答案 0 :(得分:1)

如果您改用child_process.spawn,则应该可以使用stdio的选项来调用它:

spawn(cmd, [], { stdio: 'ignore' });

child_process.spawn docs

编辑:

如果您是Promise的粉丝,那么这是我写来帮助解决问题的实用程序

const quietSpawn = (cmd, args = []) => {
    const splitCmd = cmd.split(' ');

    if (splitCmd.length > 1) {
        [cmd, ...args] = splitCmd;
    }

    return new Promise((resolve, reject) => {
        const proc = spawn(cmd, args, { stdio: 'ignore' });

        proc.on('exit', resolve);
        proc.on('error', reject);
    });
};