Родительский процесс получит событие exit. Если дочерний процесс завершился с ошибкой, также будет сгенерировано событие error и передан объект ошибки. Стандартные потоки ввода-вывода дочернего процесса (stdout, stderr) будут закрыты, и родительский процесс должен обработать эти события, чтобы избежать утечек ресурсов (например, очистить обработчики событий).
Что произойдет, если дочерний процесс завершится?
Родительский процесс получит событие exit.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Что произойдет, если дочерний процесс завершится?
Ответ
Родительский процесс получит событие exit. Если дочерний процесс завершился с ошибкой, также будет сгенерировано событие error и передан объект ошибки. Стандартные потоки ввода-вывода дочернего процесса (stdout, stderr) будут закрыты, и родительский процесс должен обработать эти события, чтобы избежать утечек ресурсов (например, очистить обработчики событий).
Пример обработки завершения:
const { spawn } = require('child_process');
const child = spawn('ls', ['-lh', '/usr']);
child.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
child.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
child.on('error', (err) => {
// Обработка ошибки запуска или выполнения процесса
console.error('Failed to start subprocess.', err);
});
child.on('exit', (code, signal) => {
// Обработка завершения процесса
if (code !== 0) {
console.warn(`Child process exited with code ${code} and signal ${signal}`);
} else {
console.log(`Child process exited successfully.`);
}
});
Если родительский процесс не прослушивает событие exit, он продолжит свое выполнение. Если дочерний процесс завершился с ошибкой и событие error не обработано, возникнет необработанное исключение и, скорее всего, родительский процесс завершится.
Также могут возникнуть процессы-зомби, если родительский процесс не обрабатывает событие exit и операционная система не может корректно очистить ресурсы дочернего процесса. Это происходит, когда дочерний процесс завершился, но его PID и статус завершения остаются в таблице процессов до тех пор, пока родитель не "соберет" его статус.