문제

Linux는 다음과 같은 임의의 Posix-Signal을 보내는 것을 지원합니다 SIGINT 또는 SIGTERM The kill-명령. 하는 동안 SIGINT 그리고 SIGTERM 친절하거나 친절하지 않은 방식으로 프로세스를 끝내는 지루한 오래된 방법입니다. SIGQUIT 코어 덤프를 트리거하기위한 것입니다. 이것은 실행중인 Java VM을 트리거하여 모든 실행중인 스레드의 스택 트레이스를 포함하여 스레드 덤프를 인쇄하는 데 사용될 수 있습니다. 디버깅 정보를 인쇄 한 후 Java VM은 이전에 무엇을했던 모든 일을 계속할 것입니다. 실제로 스레드 덤프는 최대 우선 순위의 다른 스폰 된 스레드에서 발생합니다. (사용하여 직접 시도해 볼 수 있습니다 kill -3 <VM-PID>.)

(지원되지 않은!)를 사용하여 자신의 신호 처리기를 등록 할 수도 있습니다. Signal 그리고 SignalHandler 수업 sun.misc-패키지, 당신은 그것으로 모든 종류의 재미를 가질 수 있습니다.

그러나 아직 Windows 프로세스에 신호를 보내는 방법을 찾지 못했습니다. 신호는 특정 사용자 입력에 의해 생성됩니다. Ctrl-C 트리거 a SIGINT 예를 들어 두 플랫폼 모두에서. 그러나 Windows에서 실행 중이지만 비 중과 프로세스에 신호를 수동으로 보낼 수있는 유틸리티가없는 것 같습니다. 명백한 해결책은 Cygwin을 사용하는 것입니다 kill 실행 파일이지만 적절한 Windows API를 사용하여 Windows 프로세스를 종료 할 수 있지만 SIGBREAK (창은 동일합니다 SIGQUIT) 그것으로; 사실 나는 그것이 Windows 프로세스로 보낼 수있는 유일한 신호는 SIGTERM.

따라서 긴 이야기를 짧게 만들고 헤드 라인을 반복하려면 : Windows의 프로세스에 임의의 신호를 보내는 방법은 무엇입니까?

도움이 되었습니까?

해결책

당신이 원하는 것이 어떤 종류의 다른 프로그램/프로세스를 명시 적으로/프로그래밍으로 죽이는 것이라면, sysinternals의 pstools 내에 "pskill"이라는 작은 도구가 Unixen "Kill"처럼 행동하는 작은 도구가 있습니다.

다른 것을 원한다면 계속 읽으십시오 (아래 세부 사항 중 일부에서 잘못되었을 수도 있지만 Winapi와 Charles Petzold의 훌륭한 책 "Windows for Windows"만 사용하여 C에서 Windows 프로그램을 마지막으로 개발 한 이후는 Eons였습니다. ).

Windows에서는 "신호"가 올바르게 없으며 운영 체제에서 Winmain 및 WinProc을받는 기능은 간단합니다. 메시지. 예를 들어, 창의 "X"버튼을 클릭하면 Windows는 해당 Windows 핸들러 메시지 wm_close를 보냅니다. 창이 삭제되었지만 프로그램이 여전히 실행되면 wm_destroy를 보냅니다. 기본 메시지 처리 루프에서 벗어나려고 할 때 Winmain (WinProc 아님)은 WM_QUIT를받습니다. 귀하의 프로그램은 예상대로 이러한 모든 것에 응답해야합니다. 실제로 WM_CLOSE를 수신 할 때해야 할 일을하지 않음으로써 "불가능한"응용 프로그램을 실제로 개발할 수 있습니다.

사용자가 Windows Task Manager에서 작업을 선택하고 "END TASK"를 클릭하면 OS가 WM_CLOSE (및 기억하지 못하는 다른 것)를 보냅니다. 그러나 "최종 프로세스"를 사용하는 경우 프로세스가 직접적으로 끊어지면 메시지가 전송되지 않습니다 (출처 : 오래된 새로운 것

다른 프로세스의 HWND를 얻을 수있는 방법이 있다는 것을 기억합니다. 일단 다른 프로세스가 해당 창을 통해 메시지를 전달할 수 있습니다.

다른 팁

Windows는 POSIX가 아닙니다. 신호가 없습니다. 콘솔 프로그램이 얻는 유일한 '신호'는 SetConsoleCtrlHandler, 이 경우 사용자가 Ctrl+C, Ctrl+Break, 콘솔 창을 닫고 로그 오프하거나 시스템을 종료했다는 사실을 알 수 있습니다.

다른 모든 것은 IPC, 일반적으로 창 메시지 또는 RPC로 수행됩니다. Sun의 문서를 확인하여 Windows JRE에서 요구하는 작업을 수행하는 방법이 있는지 확인하십시오.

Windows에서는 모든 것이 Win32 메시지를 중심으로 진행됩니다. 나는 이것을 수행하기위한 명령 줄 도구가 있다고 생각하지 않지만 C ++에서는 사용할 수 있습니다. Findwindow 다른 Windows 프로그램에 임의의 메시지를 보냅니다. 예 :

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

COM Interop을 사용하여 C#에서도 수행 할 수도 있습니다.

jconsole을 사용하여 모든 실행중인 스레드의 스택 트레이스를 볼 수도 있습니다. 이것은 Windows 및 Java를 지원하는 다른 OS에서 작동합니다. JConsole에는 다른 많은 멋진 기능, 메모리 그래프, CPU 그래프 등이 있습니다.

그것은 당신의 원래 질문에 대답하지 않지만, 동일한 결과를 얻을 수 있기를 바랍니다.

JCONSOLE에 익숙하지 않은 경우 jconsole 사용 선적 서류 비치.

나는 단지 그냥 궁금합니다 pstools 현재 Microsoft가 소유하고 있습니다. sysinternals 당신을 도울 것입니다.

루비는 어떻게 든 창에서 시그 킬 등을 (적어도 에뮬레이션) (적어도 에뮬레이션) 할 수 있고 해당 메시지를 가두겠습니다. 확인하고 싶을 수도 있습니다.

Windows에서 Ruby가 "해당 프로세스에 신호를 보내는 방법"은 실제로 전화하는 것입니다. TerminateProcess 또는 해당 PID에 해당합니다.

"CTRL+C"를 잡는 Windows 동등한 방법도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top