2009-11-23 11 views
1

프로세스가 다른 사용자 컨텍스트에서 실행될 때 명명 된 이벤트와 관련된 간헐적 인 문제가 발생했습니다. WaitForSingleObject (및 WaitForMultipleObjects도 마찬가지 임) WAIT_FAILED와 함께 실패합니다 (GetLastError는 6 - 잘못된 핸들 값을 반환합니다).Win32라는 이름의 이벤트가 간헐적으로 발생합니다.

사용자 계정으로 Windows 컴퓨터에서 작업을 예약하는 응용 프로그램이 있으며 일부 작업이 완료된 후에 문제가 발생합니다.

사용자 작업을 실행하고 명명 된 이벤트가 신호를 받기를 기다리기 위해 응용 프로그램 (JobManager)이 사용자 계정 (CreateProcessAsUser)에서 실행 가능 (JobLeader)을 시작하는 서비스 부분. 수동 리셋 이벤트는 JobLeader가 "글로벌 \"네임 스페이스에 생성하고 사용자 작업이 완료되면 신호를 보냅니다.

JobManager가 루프에서 대기하면서 이름이 지정된 이벤트 또는 JobLeader 프로세스 핸들이 신호되는지 확인하기 위해 지연 시간이 10 초인 WFMO (WaitForMultipleObjects)를 호출합니다.

OpenEvent API 호출을 통해 JobManager에서 열어 주기적으로 명명 된 이벤트 핸들은 오류 코드 6 - "잘못된 핸들 값"인 WAIT_FAILED를 반환하는 WFMO (WFSO는 핸들이 손상된 것을 식별하기 위해 후방 호출 됨)를 발생시킵니다. 이벤트를 다시 열면이 오류가 발생할 수도 있고 그렇지 않을 수도 있습니다. WFMO는 잘못된 핸들 값으로 인해 WAIT_FAILED를 다시 반환 할 수 있습니다.

흥미롭게도,이 오류없이 수십 개의 작업을 통과 한 다음 순차적으로 적은 수의 작업 만 수행 할 수 있습니다. 테스트에 사용되는 작업은 동일합니다. cmd.exe 스크립트 만 사용하여 환경을 덤프 할 수 있습니다.

누구든지 아이디어가 있으십니까?

감사합니다, 알렉스

답변

2

당신이 당신의 JobManager에서 이벤트를 만든 다음 'JobLeader'에서여하십니까를? 그렇지 않은 경우 두 프로세스간에 이벤트 핸들 (및/또는 이름)을 어떻게 전달합니까?

내 직감이 경쟁 조건의 나에게 말한다

...

+0

안녕 렌, 제가 위에서 언급 한 바와 같이 - 글로벌 \ "네임 스페이스" "수동 리셋라는 이름의 이벤트가에 JobLeader에 의해 만들어집니다"- CreateEvent에()를 사용하여 . JobLeader는 사용자 작업을 제어하며 작업 완료시 JobManager에 알리고 SetEvent()를 통해이 명명 된 이벤트를 알립니다. JobManager는 특히 "OpenEvent"를 사용하여이 명명 된 이벤트를 엽니 다. 이전 시도가 실패한 경우 (이벤트가 아직 JobLeader에 의해 작성되지 않은 경우) - 10 초마다 열려고 시도하면서 150 초 동안이 작업이주기에서 수행됩니다. 그래 ... 내 직감은 ... 특히 간헐적 인 이유 때문에 ... –

+0

또한 - 로컬 소켓을 통해 JobLeader와 JobManager - RPC 사이에 하나 이상의 통신 채널이 있습니다. 이 연결을 설정하기 위해 나는 또한 RPC 서버가 JobLeader에 의해 시작될 때 설정되는 named 이벤트를 사용하여 JobManager가 그것에 연결하여 작업 정보 (환경, 명령 행 및 인수, 작업 디렉토리 등)를 전달할 수 있습니다. 이벤트 이름은 고유 한 작업 ID (숫자)와 JobLeader 프로세스 ID를 사용하여 구성됩니다. BTW - RPC 서버 준비 상태를 나타내는 데 사용되는 명명 된 이벤트와 관련된 문제를 본 적이 없음 ... –

+0

JobManager에서 이벤트를 만든 다음 생성 된 프로세스에서 열지 않는 이유는 무엇입니까? 경쟁 상황이 발생할 가능성은 없습니다. 실패가 Wait() 단계에 있기 때문에 열기 후에 오류를 확인하고 있습니까? 당신은 당신에게 이벤트를 OK라고 말하고 대기()에서 실패합니까? 열기가 실패하는 보안 권한이 될 수 있습니까? –