Убивая его сигналом, отличным от SIGKILL, просто вызывает отправку сигнала. Это может быть замаскировано или проигнорировано, но при условии, что это не так (или после того, как оно снято), оно прерывает нормальный запуск программы.
Если выполняется системный вызов IPC-типа (например, чтение из сокета, select (), poll (), sleep () и т. Д.), Он будет прерван и завершится ошибкой с EINTR по ошибке. Правильно написанное приложение повторно выполнит вызов после обработки сигнала.
Затем процесс немедленно выполняет вызов обработчику сигнала, который может вернуться, чтобы продолжить обработку, или вызвать longjmp (на C), или выйти из процесса, что обычно является значением по умолчанию.
SIGKILL совершенно другой, ничего из вышеперечисленного не происходит. Вместо этого он просто завершает системный вызов (который, по-видимому, оставил бы EINTR в состоянии errno, если бы процессу было разрешено его прочитать), а затем немедленно завершает задачу, не имея возможности обработать его.
Но любой из них, я думаю, ждет завершения состояния "D" "непрерывного сна". Обычно это что-то вроде блокировки диска при чтении, загрузки страницы по требованию или что-то в этом роде.