Устранить буферизацию данных дочернего процесса - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь создать дочерний процесс из сценария node.js (parent) таким образом, чтобы не было никаких помех между родительским и дочерним потоком данных.Родитель должен иметь идентификатор дочернего процесса только при запуске дочернего процесса и иметь возможность завершить его.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 голосов
/ 17 января 2019

Если вы используете child_process.spawn вместо этого, вы сможете вызвать его с параметрами для stdio:

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

child_process.spawn docs

EDIT:

Если вы поклонник 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);
    });
};
...