Какво ще се случи, ако процесът на дете приключи?
sobes.tech AI
Отговор от AI
Родителският процес ще получи събитието 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('Неуспешен старт на подпроцеса.', err);
});
child.on('exit', (code, signal) => {
// Обработка на приключване на процеса
if (code !== 0) {
console.warn(`Детският процес излезе с код ${code} и сигнал ${signal}`);
} else {
console.log(`Детският процес приключи успешно.`);
}
});
Ако родителският процес не слуша събитието exit, той ще продължи изпълнението си. Ако детският процес приключи с грешка и събитието error не е обработено, ще възникне неуправлявано изключение и вероятно родителският процес ще приключи.
Също така могат да възникнат зомби процеси, ако родителският процес не обработва събитието exit и операционната система не може правилно да почисти ресурсите на детския процес. Това се случва, когато детският процес е приключил, но неговият PID и статус на приключване остават в таблицата с процеси, докато родителят не "събере" неговия статус.