2012-05-18 2 views
3

Azure 작업자에서 실행하려고하는 기존 응용 프로그램이 있습니다. 응용 프로그램은 익명 파이프를 만들고 stdout을 파이프로 리디렉션하고 자식 프로세스를 생성 한 다음 파이프를 사용하여 통신하는 등의 일반적인 패턴을 사용하여 자식 프로세스를 시작합니다.Azure에서 파이프 읽기가 실패합니다.

이것을 Azure에서 실행하려면이 전체 프로세스를 시작하는 DLL에 P/Invoke 호출을 작성합니다.

이 모든 기능은 Azure 외부에서 제대로 작동하지만 에뮬레이터에서 실행 중일 때라도 작동하지 않습니다.

Azure에서 실행할 때, procs는 파이프를 통해 통신 할 수 없습니다. 특히 부모에 의한 파이프 핸들을 읽는 호출이 실패했습니다 (시간 초과).

+0

네이티브 코드가 x64 용으로 컴파일되어 있습니까? – ildjarn

+0

예, 에뮬레이터 아래에서 코드를 단계별로 실행할 수 있으며 읽는 호출을 차단합니다. – AdamC

답변

2

마침내 문제는 레거시 코드가 stdout 핸들을 복제하여 자식 프로세스로 전달했기 때문이라고 생각했습니다.

Azure에서 실행 중 STDOUT에 대한 GetStdHandle이 0x0을 반환했습니다. 이것은 기본적으로 "오류는 없지만 사용자는 표준 출력이 없습니다"라는 의미입니다. 분명히 0x0 및 INVALID_HANDLE을 확인해야합니다.

핸들을 만들면 기존 핸들을 복제하는 대신 자식을 시작하기 전에 STARTUPINFO에 핸들을 설정하여 모든 것을 수정합니다.

-1

나는이 다음과 같이 두 가지 제안 : 당신이 .NET 4와 작업자 역할을 컴파일하는 경우

  1. 내가 물어 봐도 될까요? .net 4를 사용하면 P/Invoking 할 때 특별히 네트워크 파이프가있는 응용 프로그램을 바인딩 할 때 약간의 문제가 있으므로 응용 프로그램 속성을 .net 3.5 프로파일로 설정하십시오.
  2. SYSTEM 컨텍스트를 사용하여 시작 프로세스에서이 레거시 프로세스를 시작하고이 응용 프로그램 EXE를 CSDEF의 ProgramEntryPoint로 설정하여 직접 시작할 수 있습니다. 또한이 응용 프로그램과 함께 IP/포트를 사용하고 있습니까? 그렇습니다. 제대로 바인딩하려면 onStart() 역할에 코드를 작성해야합니다.

결과가 무엇인지 알려주세요.

+0

-1 감사합니다. 감사합니다. 의견을 제시해 주시면 제안 사항에 대한 문제를 이해할 수 있습니다. – AvkashChauhan

+1

나는 downvote하지 않았지만 누군가가 한 이유는 당신의 대답이 단지 질문들로 이루어져 있기 때문이라고 생각한다. – ildjarn

+0

@ Adam, 오늘 저는 Azure 지원 엔지니어와 함께 문제를 해결하고 약간의 견인력을 얻을 수있었습니다. 이 문제를 해결할 수있는 몇 가지 다른 방법이 있습니다. 나중에 더 많은 정보를 추가하겠습니다. – AvkashChauhan

관련 문제