2009-08-01 17 views
11

Sotto POSIX OS c'è un'API di segnale che consente di inviare un segnale al processo per spegnerlo con kill e si può catturarlo con sigaction e fare ciò di cui si ha bisogno;Win32 API analogico di invio/cattura SIGTERM

Tuttavia, Win32 non è il sistema POSIX, quindi:

  • Come posso gestire gli eventi di arresto che possono venire, ad esempio da "Termina processo" in "Task manager"?
  • Qual è l'API standard per l'invio del segnale di arresto all'applicazione Win32?

Non sto parlando di GUI, sto parlando del server TCP/IP che dovrebbe essere correttamente spento. che non funziona come servizio Windows.

risposta

2

Si ottiene un messaggio WM_QUIT sul tuo primo thread creato.

Quando non lo gestisci, il processo viene arrestato forzatamente.

Quindi, solo implementare una coda di messaggi nel vostro primo thread, che cerca il WM_QUIT messaggio

+1

Si dovrebbe gestire WM_CLOSE. "Il messaggio WM_QUIT non è associato a una finestra e pertanto non verrà mai ricevuto tramite la procedura della finestra di una finestra, ma viene recuperato solo dalle funzioni GetMessage o PeekMessage." -MSDN – Indy9000

+0

Posso usare lo stesso metodo per Console Ctrl + C e per process runnig come servizio di Windows? O dovrei usare metodi diversi per ognuno di essi? – Artyom

3

Potrebbe essere il Risparmio energia di Windows da MSDN sarebbe utile. Ma si occupa di eventi di sistema piuttosto che per processo.

Per un processo, è possibile rilevare la terminazione con WM_CLOSE. Dovresti gestire i messaggi di Windows. Se si tratta di un'applicazione console, è necessario installare un gestore di controllo; dare un'occhiata a SetConsoleCtrlHandler su MSDN

4

MSDNs Unix Codice Guida alla migrazione ha un capitolo su Win32 code conversion and signal handling.
Sebbene Microsoft abbia deciso di archiviare questa guida brillante, è molto utile. sono descritti

tre metodi: oggetti
segnali nativi
Evento
Messaggi