|
В данной заметке речь пойдёт о неприятных моментах заложенных в архитектуру OS/2
и способах обойти их.
Как известно, архтектура PM построенна с использованием
одной очереди сообщений. Это позволяет программе, которая некоректно работает
с ней (или неправильно обрабатывает PM хуки) полностью блокировать
пользовательский интерфейс OS/2. При этом все остальные программы продолжают
работать, но отстрелить урода средствами OS/2 вы уже не сможете.
Программа WatchCat
позволяет вам вызвать встроенный в неё менеджер задачь и отстрелить зависшую
программу (что обычно позволяет нормально работать дальше) даже при
заблокированной очереди. Установка программы
сложностей не вызывает, так что дополнительно описывать её я смысла не вижу.
Но есть ещё одна проблема - приложение может перехватить все исключения
(включая CTRL-C, CTRL-BREAK, и DosKillProcess) и не реагировать на них (например
из-за ошибки в этом самом обработчике). Такое приложение привращается в зомби -
средствами OS/2 его не убить, а ресурсы исправно продолжают потребляться.
Holger Veit - один из авторов XFree86/OS2 исследуя SES и
недокументированные возможности OS/2 нашёл, что в OS/2 Warp 3 FixPack 17 добавили
возможность убивать такие процессы. После чего он написал API которое позволет
программам используя вызов IOCTL категрии 0x76 (функция 0x65) драйвера $fastio
убивать такие программы. Для того, чтобы использовать данную возможность в программе WatchCat вам нужно:
- Скачать драйвер xf86sup и прописать DEVICE=[path]\xf86sup.sys в config.sys.
- Скачать и установить plugin wnice который используя вышеупомянутый API расширяет возможности WatchCat.
- Скачать архив c Death Api. Этот пункт опционален, нам из него потребуется только файл pig.exe для проверки hardkill.
- Перезагрузиться ;-)
После перезагрузки попробуйте запустить процесс pig.exe и прибить его из
watchcat (Kill proces в окне Renice/Kill interface). Если процесс успешно прибит,
то вам повезло и всё работает. Если же вышеупомянутый свин продолжает себе жить
как и ранее - у вас "неправильный" doscall1.dll. Если у вас OS/2 Warp 3.0, то вам поможет
DOSCALL1.DLL из FP37. В OS/2 WSEB я использую DOSCALL1.DLL скачанный с IBM
testcase. Надеюсь, что данный арсенал средств позволит вам повысить комфорт работы в OS/2.
Обсудить материал (число отзывов:12)
предыдущий материал |