Domanda

Ho sovraccaricato i 6 segnali elencati in questo sito http: // www. cplusplus.com/reference/clibrary/csignal/signal.html

Quindi ho eseguito la mia app (doppio clic non eseguito tramite IDE) e ho provato 1) termina l'attività 2) X in posizione verticale e 3) elimina il processo. Mi aspettavo che i primi due causassero un qualche tipo di segnale (sono su XP) ma purtroppo non ho ottenuto nulla. Non posso aprire file da scrivere quando si verifica un segnale? sto indovinando (SIGSEGV mi ha permesso).

Quando Firefox si blocca o quando lo uccido, ricorda quali pagine ero. Registra l'indirizzo ogni volta che faccio clic su una pagina o lo fa in caso di segnale / arresto anomalo?

la mia domanda principale è quale segnale posso usare per catturare il processo di uccisione

È stato utile?

Soluzione

Win32 non fornisce un'opzione per intercettare il programma che viene ucciso con TerminateProcess (che è ciò che accadrà quando " Termina task " da Task Manager o fai clic su [X]) .

È possibile catturare il segnale SIGSEGV poiché la libreria di runtime C fornisce un'emulazione di questo segnale durante l'esecuzione su Windows. Quando il programma causa una violazione di accesso a Windows (eccezione 0xC0000005), la libreria di runtime ha la possibilità di catturarlo e simulare un SIGSEGV in stile Unix per te. Questo, tuttavia, non è il modo migliore per gestire tale eccezione. Se stai scrivendo un programma Win32, generalmente non dovresti provare a usare i servizi in stile Unix.

Altri suggerimenti

È possibile rilevare un errore di runtime come una violazione di accesso se si sovrascrive il gestore di eccezioni predefinito che chiama SetUnhandledExceptionFilter (questa è una funzione win32 e come tale non si basa sull'emulazione della libreria C). Questo è il metodo che può essere utilizzato per fornire & Quot; minidumps & Quot; quando un programma si arresta in modo anomalo.

Ma questo gestore di eccezioni non verrà chiamato quando si chiude normalmente l'applicazione o quando l'applicazione viene chiusa da Gestione attività. Nell'ultimo caso Windows chiama TerminateProcess, non è un arresto pulito ma sta forzando la chiusura del programma.

Non sono a conoscenza di quale sia l'implementazione utilizzata da Firefox, ma per salvare le schede correnti aperte è probabile che abbia un timer in esecuzione, e ogni volta che viene eseguito salva la cronologia in un file e una sorta di sporco segno.

Altre soluzioni più complesse per rilevare quando un programma è chiuso (implementato da programmi antivirus e simili) è far funzionare due programmi non correlati, controllando che l'altro sia ancora in esecuzione e se uno rileva l'altro è stato chiuso eseguilo ancora una volta.

Le app di Windows sono app per console o app GUI. Le app della console tendono a ricevere WM_CLOSE, le app della console CTRL_CLOSE_EVENT. Né sono segnali; nessuno dei due verrà inviato se l'app viene terminata tramite TerminateProcess ().

Se vuoi archiviare dove eri, usa un file mappato in memoria e aggiornalo ad ogni azione. Quando il processo termina, la pagina sporca in memoria viene riscritta nel file dal sistema operativo, possibilmente anche in altri momenti. Questa soluzione consente al sistema operativo di gestire l'I / O del disco per te ed è in una posizione migliore per farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top