2011-09-22 2 views
0

Win32 API를 사용하여 작업 모니터/관리자를 빌드하려고합니다. 시작해야하는 새 프로세스의 인스턴스 수를 지정하는 명령 줄 인수로 시작됩니다 (Windows 서비스). C++의 작업 모니터 및 관리자

task_man.exe 40 

는 task.exe 종료 (제대로 여부가), 나는 그것을 대체 할 새로운 하나를 시작해야합니다 때마다 프로세스를 이제

task.exe 

, 40 개 인스턴스를 시작합니다. PID를 사용중인 모든 프로세스가 있는지 여부를 확인하는 루프를 다음 자신의 PID를 얻을, 그리고

시작 task_man에서 작업 :

내 거친 생각이에게 있습니다. 유효하지 않은 모든 PID에 대해 새 프로세스를 시작하고 이전 PID를 새 PID로 대체하십시오.

내가 사용할 수있는 더 좋은 디자인이나 더 나은 워크 플로우가 있습니까? 이 작업을 수행하기위한 표준 방법이 있습니까? 나는 바퀴를 재발 명하고 싶지 않다 ... 또한 어떤 API를 조사해야 하는가? 나는 또한 나중에 쉽게 변경할 수있는 디자인을 찾고 있어요

- 내가 나중에

task_man.exe 30 

를 실행하는 경우 즉, 새로운 task_man가 게재되지해야하지만, 오히려 작업의 수를 변경해야 이전 예에서. (실행이 시작될 것이라는 것을 알고, 원본을 수정 한 다음 종료해야한다고 말합니다.)

코드를 찾고 있지 않습니다. 전체 구현을 찾지 않아서 마음에 들지 않습니다. 샘플을보고), 내가 사용할 수있는 API 또는 내가 생각해 낸 전반적인 디자인에 대한 제안.

+0

당신은 "코드를 원하지 않는다"고 말하지만, 열어 볼 수있는 오픈 소스 프로그램이 존재할 때 그것은 단지 게으름입니다. 당신이 그들의 패러다임에서 글을 읽게된다면, 당신이 착수하고있는 노력이 다른 사람들의 일의 확장으로 더 잘 표현 될 것임을 알게 될 것입니다. 몇 가지 코드를 읽고 사용하는 API를 확인한 다음 해당 API에 대한 설명서를 읽으십시오. 시작하기 좋은 곳은 http : //processhacker.sourceforge입니다.net/ – HostileFork

+0

@Hostile 나는 나의 질문을 편집했다. –

+0

해당 플랫폼에서 이해할 수있는 언어로 된 완전한 구현을 두려워하지 마십시오. 완전한 구현은 종종 샘플이 단순하게 그려지는 많은 "실제"걱정을 가지고 있습니다. 사람들이 사용하는 도구를 개발한지 수년 간의 제품은 일반적으로 StackOverflow에 대한 드라이브 바이 응답보다 훨씬 더 깊습니다. 다이빙, 둘러보기, 다른 사람의 코드베이스 작성 및 단계별 실행 ... 좋은 일입니다. – HostileFork

답변

2

프로세스가 종료되었는지 여부를 확인하는 가장 쉬운 방법은 처리를 기다리는 것입니다. 당신은 몇 가지 방법으로이 작업을 수행 할 수 있습니다

  1. 모든 프로세스 핸들의 배열을 구축하고, 그들 모두에 대기 할 WaitForMultipleObjects (bWaitAll가 FALSE 인)를 사용합니다. 그런 다음 코드가 계속되면 어떤 프로세스가 종료되었는지 파악하고 새 프로세스를 작성한 다음 배열을 업데이트하고 다시 기다려야합니다.
  2. 각각 하나의 프로세스를 생성하고 WaitForSingleObject를 사용하여 하나의 핸들을 무한히 기다리는 40 개의 스레드를 실행합니다. 그런 다음 해당 작업이 끝나면 해당 스레드가 새 스레드를 작성하여 대기합니다.
  3. 40 개의 스레드를 생성하지 않으려면 WFSO를 사용하여 각 프로세스 핸들을 잠시 동안 기다리고 리턴 값을 확인하십시오. 프로그램이 이렇게 느리게 응답하지만 종료 된 프로세스를 인식하는 것이 더 쉬우 며 많은 스레드를 생성하지는 않습니다.
+0

나는 2 번을했고 그것은 매력처럼 작동한다. 감사. –

1

대기 작업으로 풀링을 바꾸려면 작성한 프로세스에 WaitForSignalObject/WaitForMultipleObjects를 사용할 수 있습니다. 프로세스 핸들은 프로세스가 종료 될 때 알려줍니다. 풀링과 달리 대기 작업은 CPU를 소비하지 않습니다. 스레드 중 하나가 신호를 보내지 않으면 대기 스레드는 비활성 상태입니다.