Нормальне завершення процесу відбувається при досягненні кінця функції або при виконанні системного виклику exit
. При цьому процес встановлює деякий код свого завершення, який може
бути прочитаний процесом-предком.
Примусове завершення процесу в Linux ззовні може бути виконано за допомогою
системного виклику kill, посилає
процесу сигнал. Детальний розгляд сигналів ми проведемо в такій
лабораторній роботі, поки ж тільки відзначимо, що гарантовано "вбити"
процес, що має PID = p, можна системним викликом:
kill(p,SIGKILL)
Очікування завершення процесу
Процес-попередник може очікувати завершення процесу-нащадка (чи
процесів-нащадків) за допомогою системних викликів wait
або waitpid. Якщо процес-нащадок
ще не завершився, процес-попередник перекладається таким системним викликом у
стан очікування до завершення процесу-нащадка (втім, процес може і не
очікувати завершення нащадка, а тільки перевірити, чи закінчилася він). Ці
системні виклики дозволяють також процесу предкові дізнатися код завершення нащадка.
Якщо процес-нащадок завершує свою роботу перш процесу-предка, і процес-попередник явно не вказав, що він не зацікавлений в отриманні інформації про статус завершення процесу-нащадка, то завершився процес-нащадок не зникає з системи остаточно, а залишається в стані закінчив виконання (зомбі-процес) або до завершення процесу-предка, або до того моменту, коли попередник перевірить завершення нащадка.
Кожен процес-нащадок при завершенні роботи посилає свого процесу-предкові спеціальний сигнал SIGCHLD, на який у всіх процесів за замовчуванням встановлено реакція "ігнорувати сигнал". Наявність такого сигналу спільно з системним викликом waitpid() дозволяє організувати асинхронний збір інформації про статус завершилися породжених процесів процесом-предком.