Domanda

Linux supporta l'invio di un arbitrario Posix-Segnale come SIGINT o SIGTERM per un processo che utilizza il kill-Comando.Mentre SIGINT e SIGTERM sono proprio noiosi vecchi modi di terminare un processo in un amichevole o non-così-friendly, tipo di strada, SIGQUIT è destinata a innescare un core dump.Questo può essere utilizzato per attivare l'esecuzione di Java VM di stampare un thread dump, tra cui il stacktraces di tutti i thread in esecuzione -- pulito!Dopo la stampa le informazioni per il debug, la Java VM continuare a fare ciò che faceva prima;infatti il thread dump accade solo in un altro thread generato la massima priorità.(Si può provare questo fuori da soli, utilizzando kill -3 <VM-PID>.)

Si noti che è anche possibile registrare la propria gestori di segnale utilizzando la (non supportato!) Signal e SignalHandler classi sun.misc-pacchetto, in modo che si può avere tutti i tipi di divertimento con esso.

Tuttavia, devo ancora trovare un modo per inviare un segnale a un processo di Windows. I segnali vengono creati da alcuni input dell'utente: Ctrl-C si innesca un SIGINT su entrambe le piattaforme, per esempio.Ma non sembra essere di qualsiasi utilità per inviare manualmente un segnale di una corsa, ma non processo interattivo su Windows.La soluzione più ovvia è quella di utilizzare il Cygwin kill eseguibile, ma mentre è possibile terminare i processi di Windows utilizzando l'apposita API di Windows, non ho potuto inviare un SIGBREAK (l'equivalente di Windows per SIGQUIT) con esso;in realtà, credo che il solo segnale è in grado di inviare a processi di Windows è SIGTERM.

Così, per fare una lunga storia breve e a ripetere il titolo:Come posso inviare arbitraria di un segnale ad un processo in Windows?

È stato utile?

Soluzione

Se quello che vuoi è esplicitamente/programmaticly uccidere un altro programma/processo, di qualsiasi tipo, all'interno della SysInternals' pstools c'è un piccolo strumento chiamato "pskill" che si comporta proprio come Unixen "uccidere" vorresti fare.

Se volete qualcosa di altro, continuate a leggere (anche se non può essere sbagliato su alcune delle caratteristiche specifiche di seguito - è stato eoni dall'ultima volta che ho sviluppato un programma per Windows in C utilizzando solo il WinAPI e di Charles Petzold libri eccellenti "di Programmazione per Windows" come guida).

Su Windows non hai propriamente "segnali", che funzioni WinMain e WinProc ricevere dal Sistema Operativo sono semplici messaggi.Per esempio, quando si fa clic sul pulsante "X" della finestra di Windows invia windows' del gestore il messaggio WM_CLOSE.Quando la finestra è eliminato, ma il programma è ancora in esecuzione, invia WM_DESTROY.Quando sta per uscire il messaggio principale del ciclo di elaborazione, WinMain (non WinProc) riceve WM_QUIT.Il programma deve rispondere a tutti questi come previsto - si può effettivamente sviluppare un "l'unclosable applicazione" non fa quello che dovrebbe, al ricevimento di una WM_CLOSE.

Quando l'utente seleziona l'attività dal Task Manager di Windows e fa clic su "termina Operazione", il sistema operativo consente di inviare WM_CLOSE (e l'altro non ricordo).Se si utilizza la funzione "termina Processo", però, il processo viene ucciso direttamente, no, i messaggi inviati mai (fonte: The Old New Thing

Mi ricordo che c'era un modo per ottenere l'HWND di un altro processo, una finestra, una volta che si ottiene che un altro processo potrebbe inviare finestra, in un messaggio al funzioni PostMessage e DispatchMessage.

Altri suggerimenti

Windows non è POSIX.Non sono segnali.Solo i "segnali" che la console di programmi è se chiamano SetConsoleCtrlHandler, in questo caso può essere notificato che l'utente ha premuto Ctrl+C, Ctrl+Break, chiuso la finestra di console, log off, o arrestare il sistema.

Tutto il resto è fatto con l'IPC, in genere con i messaggi di finestra o RPC.Controllo del Sole documentazione per vedere se c'è un modo per fare quello che stai chiedendo di Windows JRE.

In Windows tutto ruota intorno Win32 messaggi.Non credo che c'è una riga di comando strumento per fare questo, ma in C++ si potrebbe utilizzare FindWindow per inviare arbitraria di un messaggio a un altro programma di Windows.ad esempio:

#define WM_MYMSG  ( WM_USER+0x100 )
HWND h = ::FindWindow(NULL,_T("Win32App"));
if (h) {
    ::PostMessage(h, WM_MYMSG, 0, 0);
}

Questo può anche essere fatto in C# utilizzando l'interoperabilità com.

È inoltre possibile utilizzare jconsole per visualizzare il stacktrace di tutti i thread in esecuzione.Questo funziona su Windows, e qualsiasi altro sistema operativo che supporta Java.jconsole ha anche molte altre caratteristiche interessanti, la memoria dei grafici, è impegnativo grafici, etc.

Non risponde alla tua domanda originale, ma si spera che consente di ottenere gli stessi risultati.

Se il vostro non si ha familiarità con il jconsole, check out il Utilizzando JConsole la documentazione.

Mi chiedo solo se il PsTools dai, ora di proprietà di Microsoft, SysInternals potrebbe aiutare.

Ruby è in grado in qualche modo (almeno emulare) SIGINT SIGKILL, etc.su windows, e la trappola di quei messaggi.Potrebbe desiderare di check it out.

Come ruby non "mandare il segnale SIGINT al processo che," al di sotto, in windows, è in realtà per chiamare TerminateProcess o equivalente su quel PID.

C'è anche un equivalente di windows metodo per "catturare ctrl+c" immagino che è quello che chiamate.

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