서비스 상태 전환

서비스는 해당 상태의 변경 내용을 SCM(서비스 제어 관리자)에 보고합니다. 서비스 제어 프로그램 및 시스템은 SCM에서만 서비스의 상태를 확인할 수 있으므로 서비스가 상태를 올바르게 보고하는 것이 중요합니다. 서비스는 완전히 초기화된 SERVICE_STATUS 구조체에 대한 포인터를 사용하여 SetServiceStatus 함수를 호출하여 상태를 보고합니다. 구조체의 dwCurrentState 멤버에는 보고할 서비스 상태가 포함됩니다.

서비스의 초기 상태가 SERVICE_STOPPED. SCM은 서비스를 시작하면 서비스 상태를 SERVICE_START_PENDING 설정하고 서비스의 ServiceMain 함수를 호출합니다. 그런 다음 Service ServiceMain 함수에 설명된 기술 중 하나를 사용하여 초기화를 완료합니다. 서비스가 초기화를 완료하고 제어 요청 수신을 시작할 준비가 되면 서비스는 SetServiceStatus 를 호출하여 SERVICE_RUNNING 보고하고 서비스가 수락할 준비가 된 컨트롤 요청을 지정합니다. SERVICE_START_PENDING SERVICE_RUNNING 전환은 서비스가 성공적으로 시작된 SCM 및 서비스 모니터링 도구로 나타냅니다. 서비스에서 SERVICE_RUNNING 이외의 상태를 보고하는 경우 SCM 또는 서비스 모니터링 도구는 서비스를 시작하지 못한 것으로 표시할 수 있습니다.

SCM은 지정된 컨트롤 요청만 서비스에 보냅니다(항상 전송되는 SERVICE_CONTROL_INTERROGATE 요청 제외). 서비스에서 수락할 수 있는 컨트롤 요청 목록은 SERVICE_STATUS 구조체의 dwControlsAccepted 멤버를 참조하세요. 디바이스 이벤트를 수신하도록 등록하는 방법에 대한 자세한 내용은 RegisterDeviceNotification 함수를 참조하세요.

일반적으로 서비스 상태는 제어 요청을 처리한 결과로 변경됩니다. 서비스 상태가 변경되는 제어 요청에는 SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE 및 SERVICE_CONTROL_CONTINUE 포함됩니다. 서비스에서 이러한 요청을 처리하기 위해 긴 처리를 수행해야 하는 경우 긴 처리를 수행하고 해당 보류 중인 상태를 SCM에 보고하는 보조 스레드를 만들어야 합니다. (Windows Vista 및 이후 버전의 Windows에서 최상의 성능을 위해 서비스는 이 목적을 위해 스레드 풀 의 작업자 스레드를 사용해야 합니다.) 그러면 긴 처리가 완료되면 서비스가 완료된 상태 전환을 보고해야 합니다. 제어 요청을 처리하는 방법에 대한 자세한 내용은 서비스 제어 처리기 함수를 참조하세요.

특정 서비스 상태 전환만 유효합니다. 다음 다이어그램은 유효한 전환을 보여 줍니다.

유효한 서비스 상태 전환

SCM에 보고된 서비스 상태는 SCM이 서비스와 상호 작용하는 방법을 결정합니다. 예를 들어 서비스가 SERVICE_STOP_PENDING 보고하는 경우 SCM은 서비스가 종료되고 있음을 나타내기 때문에 서비스에 추가 제어 요청을 전송하지 않습니다. 서비스에서 보고한 다음 상태는 SERVICE_STOP_PENDING 후 유일하게 유효한 상태이므로 SERVICE_STOPPED 합니다. 그러나 서비스가 유효하지 않은 전환을 보고하는 경우 SCM은 호출에 실패하지 않습니다.

다음 다이어그램에서는 서비스 제어 프로그램(서비스 클라이언트)에서 시작한 제어 요청 및 서비스가 SCM에 상태 변경 내용을 보고하기 위해 만드는 SetServiceStatus 호출을 포함하여 서비스 상태 전환을 자세히 보여 줍니다. 앞서 설명한 것처럼 SCM은 서비스에서 수락할 컨트롤 요청만 보내므로 서비스가 다이어그램에 표시된 모든 요청을 받지 못할 수 있습니다.

서비스 상태 전환 세부 정보

ControlService

ControlServiceEx

SetServiceStatus