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