Pergunta

suportes Linux enviando um arbitrária Posix-Signal, como SIGINT ou SIGTERM a um processo usando o kill-Command. Enquanto SIGINT e SIGTERM são apenas chato velhas formas para acabar com um processo em um tipo amigável ou não tão amigável da forma, SIGQUIT destina-se a desencadear um core dump. Isso pode ser usado para acionar um rodando Java VM para imprimir um despejo segmento, incluindo os stacktraces de todas as threads em execução - puro! Depois de imprimir a informação de depuração, o Java VM vai continuar a fazer o que quer que estava fazendo antes; na verdade, o despejo de thread só acontece em outro segmento gerou de máxima prioridade. (Você pode tentar fazer isso por conta própria usando kill -3 <VM-PID>.)

Note que você também pode registrar seus próprios manipuladores de sinais usando o (! Sem suporte) aulas Signal e SignalHandler no-package sun.misc, assim você pode ter todos os tipos de diversão com ele.

No entanto, eu ainda tenho que encontrar uma maneira de enviar um sinal para um processo do Windows Sinais são criados por certas entradas de usuário:. Ctrl-C desencadeia uma SIGINT em ambas as plataformas, por exemplo. Mas não parece haver qualquer utilidade para enviar manualmente um sinal para uma corrida, mas o processo não-interativo no Windows. A solução óbvia é usar o kill executável Cygwin, mas ao mesmo tempo ele pode acabar Windows processa usando o apropriado API do Windows, eu não poderia enviar um SIGBREAK (Windows equivalente a SIGQUIT) com ele; na verdade eu acho que o único sinal de que é capaz de enviar para processos do Windows é SIGTERM.

Assim, para fazer uma longa história e repetir o título:? Como eu envio um sinal arbitrário a um processo no Windows

Foi útil?

Solução

Se o que você quer é matar explicitamente / programmaticly outro programa / processo de qualquer tipo, dentro pstools dos SysInternals há uma pequena ferramenta chamada 'pskill' que se comporta exatamente como Unixen 'matar' faria.

Se você quiser algo mais, manter a leitura (embora eu possa estar errado em algumas das especificidades abaixo - tem sido eras desde a última vez desenvolvido um programa do Windows em C usando apenas excelentes livros do WinAPI e Charles Petzold "Programação para Windows" como um guia).

No Windows você não tem adequadamente "sinais", que funciona WinMain e WinProc recebem do sistema operacional são simples mensagens . Por exemplo, quando você clica no botão "X" de uma janela, o Windows envia manipulador que janelas do WM_CLOSE mensagem. Quando a janela está excluído, mas programa ainda está sendo executado, ele envia WM_DESTROY. Quando ele está prestes a sair do ciclo de processamento de mensagem principal, WinMain (não WinProc) recebe WM_QUIT. Seu programa deve responder a todos estes como esperado -. Você pode realmente desenvolver uma aplicação "unclosable" por não fazer o que ele deve ao receber um WM_CLOSE

Quando o usuário seleciona a tarefa do Gerenciador de Tarefas do Windows e clica em "Finalizar tarefa", o sistema operacional irá enviar WM_CLOSE (e outro não me lembro). Se você usar "Finalizar processo", porém, o processo é morto diretamente, nenhuma mensagem enviada sempre (fonte: The Old New Thing

Eu lembro que havia uma maneira de obter o HWND de outro processo janela, depois de conseguir que outro processo poderia enviar essa janela uma mensagem através de funções PostMessage e DispatchMessage.

Outras dicas

Windows não é POSIX. Ele não tem sinais. Os únicos 'sinais' que os programas de console obter é se eles chamam SetConsoleCtrlHandler, caso em que ele pode ser notificado de que o usuário pressionou Ctrl + C, Ctrl + Break, fechou a janela do console, desconectado, ou fechar a baixo do sistema.

Tudo o resto é feito com IPC, tipicamente com mensagens de janela ou RPC. Verifique a documentação do Sun para ver se há uma maneira de fazer o que você está perguntando sobre Windows JRE.

Tudo gira

Em Windows em todo mensagens Win32. Eu não acredito que há uma ferramenta de linha de comando para fazer isso, mas em C ++ você pode usar FindWindow para enviar uma mensagem arbitrária para outro programa do Windows. por exemplo:.

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

Isto pode também ser feito em C # usando interoperabilidade.

Você também pode usar jconsole para exibir o stacktrace de todos os segmentos em execução. Este trabalho no Windows, e qualquer outro sistema operacional que suporte Java. jconsole também tem muitas outras características interessantes, gráficos de memória, gráficos de CPU, etc.

Ele não responder à sua pergunta original, mas espero que permite que você obtenha os mesmos resultados.

Se o seu não está familiarizado com jconsole, veja o Usando a documentação JConsole .

Eu só estou querendo saber se o PsTools de, agora Microsoft propriedade, SysInternals iria ajudá-lo.

Ruby é de alguma forma capaz de (pelo menos emular) SIGINT SIGKILL etc. no Windows, e prender essas mensagens. Pode querer verificá-la.

Como Ruby faz "sinal de send SIGINT para esse processo" embaixo, nas janelas, é realmente para TerminateProcess chamada ou equivalente em que PID.

Há também um método equivalente janelas para "pegar ctrl + c" Imagino que é o que chama de lá.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top