Oppure

Loading
16/03/10 21:40
robrock80
Salve a tutti. In Windows esiste un modo per intercettare da parte del processo stesso la sua chiusura?
Ossia c'è un modo per lanciare una funzione da parte del processo stesso qualora venisse killato?
Ultima modifica effettuata da robrock80 16/03/10 21:47
aaa
17/03/10 0:02
TheKaneB
si può fare, si può fare...

Spiegazione lunga:
msdn.microsoft.com/it-it/library/…

Spiegazione breve:
riassumendo, crei una funzione che funge da handler, e la "registri" come handler personalizzato per la gestione del segnale di terminazione ( SIGTERM )

#include <stdio.h>
#include <signal.h>

// Questa funzione sarà "magicamente" chiamata dall'OS
void funzioneStrafica(int segnale)
{
  if ( segnale == SIGTERM )
  {
    printf("Figata, mi stanno chiudendo!\n");
    exit(0);
  }
}

int main()
{
  // Installo un handler per il segnale di chiusura,
  // Passo alla funzione l'identificatore del segnale che mi interessa (SIGTERM)
  // e anche il puntatore alla funzione che deve essere chiamata (funzioneStrafica)
  signal( SIGTERM, funzioneStrafica );

  while (1) ; // Loop infinito, perchè in fondo, a me, me piace...

  return 0;
}


PS: Non ho provato il codice, ma dovrebbe andare ;)
aaa
17/03/10 8:58
The SIGILL and SIGTERM signals are not generated under Windows.
17/03/10 9:58
robrock80
Postato originariamente da nessuno:

The SIGILL and SIGTERM signals are not generated under Windows.


... They are included for ANSI compatibility. Thus you can set signal handlers for these signals with signal, and you can also explicitly generate these signals by calling raise.

Non riesco a capire il continuo (preso su MSDN) della riga che tu hai scritto (Maledetto inglese)
Ultima modifica effettuata da robrock80 17/03/10 10:01
aaa
17/03/10 10:29
Non puoi usare quei segnali perchè non sono generati da Windows. Per compatibilità, puoi indicare nel tuo codice delle funzioni che le gestiscano e puoi esplicitamente generare i segnali chiamando la raise.

In pratica, non funzionerà se chiudi un processo dal task manager.

Per individuare la chiusura di un processo, mi sa che l'unico modo è effettuare un hooking della API TerminateProcess (una sorta di detours) ... ma non è affatto una cosa semplice.
17/03/10 10:38
robrock80
Ho trovato questo,

codeproject.com/KB/DLL/…

prima che lo inizio a studiare, pensi che mi possa aiutare?
aaa
17/03/10 10:44
Sì ... potrebbe ma

1) il lavoro potrebbe rivelarsi complesso, più di quanto appare nell'articolo ...

2) questo tipo di approccio potrebbe essere individuato come "malvagio" da parte di antivirus ...

3) probabilmente ti basta un metodo più semplice ...

Pensavo ad un processo "sentinella" avviato dal processo principale. Potrebbero "sorvegliarsi" a vicenda (a tempo) in modo che uno riavvii l'altro quando non lo trova.
17/03/10 10:50
robrock80
... Avevo pensato anche io alla soluzione di un handler al processo, ma se riesco a renderlo autonomo è meglio. Stò leggendo l'articolo ed è un pò complicato: io ci provo...
Ti ringrazio per l'attenzione dedicata fino ad ora e se riesci a scoprire qualcosa al riguardo (o se decidi di cimentartici) fammi sapere.
Ultima modifica effettuata da robrock80 17/03/10 10:52
aaa