2009-11-30 9 views
2

에 의해 내가 프로세스가 여전히 및 실행 여부를 확인하기 위해 두 가지 방법이있다 :결정 - PID

1) GetExitCodeProcess을 (사용) 2) 위해 CreateToolhelp32Snapshot를 사용하여 프로세스의 목록을 걸어() 및 PID를 확인

지금, 나는 아직도 내가 TerminateProcess로 끝난 프로세스가 그게 아니더라도 살아있는 동안입니다.

프로세스가 아직 살아 있는지 또는 PID를 죽은 것인지 여부를 확실하게 알 수있는 방법이 있습니까? 덕분에 !

+0

TerminateProcess로 프로세스를 종료했는데, 확실히 죽었 습니다만 프로세스 목록에 있습니까? 세 번째 단락은 모순입니다. – Thanatos

+0

글쎄, 난 프로세스 탐색기에서 볼 수 있지만 GetExitCodeProcess()와 프로세스를 통해 도보 PID가 아직 거기에 반환됩니다. – Jessica

답변

3

GetExitCodeProcess을 호출하면 활성 프로세스에 대해 STILL_ACTIVE을 반환해야합니다. TerminateProcess로 전화하면 프로세스가 종료되고 다른 값이 반환됩니다.

프로세스가 살아 있는지 확인하는 또 다른 방법은 WaitForSingleObject입니다. 시간 제한이 0 인 프로세스 핸들에서 이것을 호출하면 프로세스가 여전히 실행 중이면 즉시 WAIT_TIMEOUT을 리턴합니다.

+0

음, 그건 그렇지 않습니다. TerminateProcess()가 호출 된 후 GetExitCodeProcess로 확인하고 STILL_ACTIVE를 반환합니다. 프로세스 테이블이 업데이트되지 않았거나 시간이 너무 많이 걸리는 것 같아요. – Jessica

+0

TerminateProcess가 STILL_ACTIVE (259)를 오류 코드로 지정할 수 있습니다. 죽은 과정을 살아있는 과정처럼 보이게 만들 것입니다. 팁을 주신 덕분에 'WaitForSingleObject' (편집 된 답변) – Andomar

+0

으로 다시 확인하실 수 있습니다. 코드를 추가하고 WAIT_TIMEOUT (258)을 반환하므로 프로세스가 실행 중입니다. 심지어는 – Jessica

3

이런 식으로 PID를 사용하지 마십시오. PID는 재사용되며 은 매우 좁은 범위 인이고 은 매우의 높은 충돌 확률을가집니다. 즉, 실행중인 프로세스가 있지만 다른 프로세스가됩니다.

+0

감사합니다. 더 나은 해결책은 무엇일까요? 코드하시기 바랍니다 – Jessica

+0

더러운 먼지가 없습니다. 요구 사항을 더 잘 설명하고 프로세스를 죽이는 이유와 프로세스가 여전히 실행 중인지 왜 신경 쓰입니까? 대부분의 경우 솔루션에는 세마포어와 같은 일부 IPC 공유 리소스가 필요하며 프로세스에서 협력해야합니다 (프로세스에서 코드를 실행할 수 있어야 함). 외국 프로세스의 경우 실제 솔루션이 없습니다. –

+0

Windows 프로세스를 공유 할 수있는 커널 오브젝트 (예 : Named Pipe) (Unix가 아닌 Windows라는 이름의 파이프)를 사용하십시오. PID가 재사용되는 경우 동일한 유형의 프로세스가 아니면 같은 이름의 명명 된 파이프를 열지 않을 수 있습니다. 그러나, 나는 당신이 동기화 세분성의이 수준을 위해 가지 않는 감각이있다. –

0

저수준 API 호출이 보이는대로 작동하는지 또는 이름이나 상위 수준 설명에서 기능이 어떻게 작동하는지 생각할 수 없습니다. 커널은 여전히해야 할 일이 있으며 종종 호출은 단지 커널에 대한 요청 일 뿐이며 실제로 PID를 릴리즈하기 전에 커널이해야 할 일이 많습니다 (구현에 따라 다름). 이 경우 호출을 한 후에 프로세스가 종료되었다고 가정 할 수 있지만 커널은 계속 정리해야합니다.

From MSDN :

를 TerminateProcess 함수는 무조건 출구 프로세스의 원인 를 사용합니다. ExitProcess 대신 TerminateProcess를 사용하는 경우 동적 연결 라이브러리에 의해 유지 관리되는 (DLL)의 상태가 손상 될 수 있습니다.

TerminateProcess는 종료를 시작하고 즉시 반환됩니다. 이렇게하면 프로세스 내에서 모든 스레드가 실행되지 않고 보류중인 모든 I/O 의 취소가 요청됩니다. 종료 된 프로세스는 보류중인 모든 I/O가 완료되거나 취소 될 때까지 종료 할 수 없습니다.

프로세스가 이 종료되는 것을 막을 수 없습니다.

+0

감사 정보 – Jessica

0

Process Status API을 사용할 수 있습니까? 시스템에 실행중인 모든 프로세스가 enumerating 인 기능이 있습니다. 이것이 도움이 될 수 있습니다.