Как отловить завершение процесса?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by kap00stik, 1 Nov 2012.

  1. kap00stik

    kap00stik New Member

    Joined:
    26 Jun 2010
    Messages:
    28
    Likes Received:
    0
    Reputations:
    0
    Здрасте,

    меня интересует можно ли как-то отреагировать на убийство процесса? Короче другими словами, когда юзер закрывает окно программы, программа получает сообщение WM_DESTROY и тд. А когда например юзер убивает программу таскманагером, то программа это сообщение не получает. Как определить что процесс завершается?
     
    #1 kap00stik, 1 Nov 2012
    Last edited: 1 Nov 2012
  2. drim

    drim Member

    Joined:
    27 Aug 2009
    Messages:
    347
    Likes Received:
    33
    Reputations:
    4
    есть 2 вида завершения процесса — мягкий и жёсткий. В первом случае, приходит системное сообщение (в *nix — сигнал) и процесс самостоятельно завершает работу; это сообщение можно перехватить внутри самого процесса и обработать по-своему. Во втором случае процесс прибивается принудительно внешними средствами — операционная система исключает его из планировщика процессов и освобождает все ресурсы; это событие внутри самого процесса никак не отловить, его "никто не спрашивает".
    Теоретический вариант — пока жив основной процесс, создать новый процесс, изменить его родителя и отслеживать в системе основной процесс. Как только основного не станет — выполнить какие-то действия. Не знаю, прокатит ли в случае "Завершить дерево процессов".
     
  3. kap00stik

    kap00stik New Member

    Joined:
    26 Jun 2010
    Messages:
    28
    Likes Received:
    0
    Reputations:
    0
    Ясно, спасибо за просвятление.
    Придется походу действительно запускать вспомогательный процесс и уже из него простукивать каждые пару сек. основной процесс. Наверное будет и самый простой походу вариант.
     
  4. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    http://ru.wikipedia.org/wiki/Signal.h
    в линуксе 3 сигнала могут завершить программу: 3,9,15
     
    1 person likes this.
  5. C@T

    C@T Member

    Joined:
    7 Sep 2011
    Messages:
    12
    Likes Received:
    6
    Reputations:
    10
    Можешь попробовать перехватить TerminateProcess в диспетчере задач
     
  6. kap00stik

    kap00stik New Member

    Joined:
    26 Jun 2010
    Messages:
    28
    Likes Received:
    0
    Reputations:
    0
    Да нет, во первых дело не о линухе. А во вторых овчинка выделки не стоит.
    Просто Prog1 иногда запускает prog2 и комуницирует с ней. Если prog1 завершается она посылает сообщение WM_DESTROY также и prog2. Но вот если prog1 убить то prog2 остается висеть в памяти, что не есть плохо, но не есть "чисто сработанно".
    Решил проблему созданием нити в prog2 которая простукивает prog1 на существование, и если такогого процесса больше нет, выполняет ExitProcess() и баста.