воскресенье, 12 февраля 2012 г.

Особенности костылестроения под Windows

Вчера мой бывший шеф за кружечкой пива рассказал массу занятного про написание программ под Windows. Поскольку приходится писать для заказчиков, которые линукс освоить не могут, а поставляемые его конторой продукт иметь хотят.

Одна из его историй изрядно позабавила. Прошу заметить, мопед не мой, я рассказываю лишь то, что рассказали мне. Поэтому комменты вида "а почему не сделали вот так?" буду пропускать мимо, но передам при случае автору, если что. Рассказываю по по памяти, но могут быть неточности. поскольку был немного под пивом.

Итак, есть в любой юникосоподобной системе, например Linux или FreeBSD такая замечательная утилита lsof. Про её пользу и назначение никому рассказывать не надо, надеюсь?

Ну, вот, потребовалось ему аналогичное под под Windows реализовать. Просто потому, что система никак штатными средствами не показывает кто держит локальный экзешеник или dll. То есть узнать кто держит файл по сети - без проблем. Через терминальную сессию - тоже, локально - фиг вам. Хорошо, есть такая функция в winapi, которая показывает все открытые дескрипторы файловой системы. Типа, зашибись. Есть что надо. Осталось только нужное написать.

Ага, пишет. Выясняется следующее - если эта утилита натыкается на любой именованный канал aka пайп при опросе, то она не возвращает управление обратно. Вообще. Совсем. Обойти никак, потому, что надо же сначала при выяснить, а что это такое там файл держит. Изначально ведь неясно, что там за процесс. Т.е. проигнорировать не получится, сказав - "видишь пайп - пройди мимо", если он определяет, что это пайп, то софтина из глубокого зависа уже не выходит. По вышеуказанной причине. "Что за фигня?", скажете вы. Вот тоже самое сказал он, когда с этим столкнулся.

Рытьё MSDN не помогает. Нету ничего. Сертифицированные по самые гланды разработчики под Windows тоже разводят руками. В итоге он пишет письмо самому Марку Руссиновичу, мол, такая вот ситуация. Делал так, делал эдак. Ничего не помогает. Руссинович пишет ему ответ в таком духе, что "не сношай себе мозг, пиши драйвер работающий на уровне ядра системы, который сможет выполнить нужное".

Драйвер. Уровня ядра. Чтобы посмотреть, наконец, мать вашу, какой процесс держит ФС. Те, кто реально работает с Linux, поймут идиотизм ситуации.

Морали не будет. Думайте сами.

Комментариев нет:

Отправить комментарий