Вы не можете принудительно убить код ядра, если он не хочет, чтобы его убивали. Код ядра не может быть уничтожен в произвольное время, потому что он может находиться в процессе доступа к периферийному устройству, он может удерживать блокировку, он может выделять некоторые ресурсы, которые необходимо освободить ... Код пользовательского пространства может быть уничтожен, потому что ядро содержит все эти ресурсы от имени процесса и очищает их, если процесс умирает. Но внутри ядра каждый фрагмент кода должен обрабатывать свою собственную очистку.
Обычно код ядра проверяет наличие сигналов и полностью прекращает свои действия, если получает сигнал. Но вы столкнулись с ошибкой ядра. В этом случае вам не повезло. Если код застрял, значит он застрял. Поскольку застрявший код выполняется в контексте системного вызова процесса, этот системный вызов никогда не вернется (если ситуация внутри ядра каким-либо образом не исправится сама собой). Процесс находится в середине системного вызова, поэтому его нельзя убить. Сигнал KILL помещается в очередь, и если системный вызов когда-либо вернется, процесс немедленно прекратит работу, но если системный вызов не вернется, процесс зависнет.
Я могу подтвердить, что эта ошибка существует и на других Unices, работающих ksh93
.
Глядя на то, как текущая разрабатываемая версия оболочки ksh93
справляется с этим, эта конкретная ошибка кажется исправленной.
Разрабатываемая версия доступна на GitHub(в ветке master
), а версия, которую я пробовал, сообщает строку версии Version A 93v-1400-g3d8a9fe4
.
Насколько мне известно, в настоящее время дата следующего релиза не установлена, но, судя по частым коммитам в кодовую базу, идет разработка.