2017-02-17 12 views
4

사용자가 정의한 명령 (일반적으로 HTTP 서버)을 생성하는 명령 줄 응용 프로그램을 만들고 있는데 응용 프로그램의 작업이 끝나면 프로세스가 종료되어야한다는 것을 알고 있습니다.Windows에서 명령 줄 응용 프로그램을 정상적으로 종료하십시오.

UNIX에서는 SIGTERM을 보내서 처리 할 수 ​​있습니다. 프로세스가 종료되지 않으면 SIGKILL에서 잔인하게 죽일 수 있습니다.

Windows에서 SIGTERM 시나리오의 대안을 찾기 위해 고심하고 있습니다. 나는 (! /f없이) taskkill /PID XXXX있다 배웠지 만

  1. 나는 그래서 내가 그것을 테스트 할 수 없습니다, taskkill /PID XXXX는 후드 아래에 무엇을하는지에 대한 정보를 찾을 수 없습니다. taskkill /PID XXXX이 프로세스 측에서 보내는 모든 것을 처리하는 방법을 찾을 수 없습니다.
  2. cmd.exe의 명령과 작동하지 않는 것 같습니다. 나는 그것을 하나의 cmd.exe에 간단한 서버 프로세스를 실행 taskkill /PID XXXX에 다른 창에서의 PID와를 얻기 위해 노력했지만 그렇게에서 taskkill 거부 : ERROR: The process with PID XXXX could not be terminated. Reason: This process can only be terminated forcefully (with /F option).

그래서 내 질문은 : 명령 줄 프로세스를 통보하는 방법 Windows에서 강제로 종료하지 않고 종료해야합니까? 종료 될 프로세스에서 이러한 메시지를 수신하여 처리하는 방법은 무엇입니까?

답변

3

GenerateConsoleCtrlEvent은 사용자가 Ctrl + C 또는 Ctrl + Break를 누른 것처럼 콘솔 응용 프로그램에 신호를 보냅니다. 콘솔 응용 프로그램은 SetContolCtrlHandler을 사용하여 이러한 신호를 무시할 수 있지만 기본적으로 ExitProcess는 자체적으로 수행합니다.

이것은 사용자가 콘솔 창을 닫거나 로그 오프하거나 종료 할 때 Windows가 사용하는 것과 같은 신호입니다.

+0

자바 스크립트 (node.js)와 같은 프로그래밍 언어에서 이러한 신호를 보내려면 어떻게해야합니까? –

+0

@HonzaJavorek : 죄송합니다. 어쩌면 질문에 알맞은 언어 태그를 추가하여 알고있는 사람들에게 질문을 알릴 수 있습니다. –

3

TaskKill은 프로세스에 가시적 인 창이있는 경우 PostMessage(hwnd, WM_CLOSE, 0, 0); (기본적으로 창에서 X를 누르는 것과 같습니다)을 사용합니다.

응용 프로그램이 콘솔 응용 프로그램이라는 것을 알고 있다면 GenerateConsoleCtrlEvent을 대신 사용할 수 있습니다.