TerminateProcess и взаимоблокировки

Реально ли функция TerminateProcess в Windows могла зависнуть из-за того, что потоки внутри процесса застряли в тупике?

Пример: процесс A выполняется под контролем процесса B, теперь процесс A попадает в тупик, и процесс B обнаруживает это и решает «убить» процесс A с помощью TerminateProcess.

Удастся ли убить зависший процесс А?


person Tony The Lion    schedule 25.05.2010    source источник


Ответы (3)


Да, все объекты ядра, удерживаемые процессом, будут освобождены, включая блокировки.

Основная проблема с TerminateProcess заключается в том, что процесс не имеет права голоса в этом вопросе: если он удерживает какое-либо глобальное состояние (файлы, общую память и т. д.), то у вас нет гарантии, что эти вещи находятся в согласованном состоянии после завершения процесса.

person Dean Harding    schedule 25.05.2010
comment
Итак, что может привести к зависанию во время Killing it, а также к зависанию его материнского процесса? - person Tony The Lion; 26.05.2010
comment
Если у него есть ожидающий ввод-вывод, ядро ​​ожидает завершения ожидающего ввода-вывода, прежде чем завершить процесс. Если процесс находится в режиме ядра, он также будет ждать, пока он не завершится (оба процесса довольно редки и обычно указывают на плохой драйвер или плохое оборудование). - person Dean Harding; 26.05.2010

Да. Пока у вас есть правильные разрешения, TerminateProcess убьет другой процесс, независимо от того, насколько хорошо он завис.

person JSBձոգչ    schedule 25.05.2010

TerminateProcess уничтожит каждый поток (как если бы TerminateThread использовалось для каждого потока в процессе).

Но это не убьет потоки, застрявшие в ядре (например, из-за ошибки драйвера устройства).

person Richard    schedule 25.05.2010