2011-02-14 3 views
2

현재 디렉터리의 MinGW 배포판에서 make.exe를 실행하고 해당 STDOUT 데이터와 종료 코드를 사용하는 프로그램을 작성하려고합니다. CreatePipe로 만든 데이터를 가져 오는 STDOUT을 처리하는 핸들이 있습니다. 내가 그 파이프에 ERROR_HANDLE_EOF을 얻을 때 나는 프로세스가 종료 된 가정의 종료 코드를 얻으려고 :OpenProcess 오류 87 잘못된 매개 변수

내 코드는 내가 (PWD, LS 등과 같은) 테스트 다른 모든는 MinGW 유틸리티에서 작동
if(session->pid == 0) return; 
HANDLE hp = OpenProcess(PROCESS_QUERY_INFORMATION | 
      PROCESS_TERMINATE, TRUE, session->pid); 
if(hp == NULL) { 
    printf("OpenProcess(%i) failed, error: %i\n", 
     session->pid, (int)GetLastError()); 
    return; 
} 

, I 문제없이 STDOUT과 종료 코드를 얻으십시오. 나는 메이크업에 그것을 시도 할 때, 위의 코드는 다음과 같은 메시지를 표시합니다

"(2032) OpenProcess에이 오류 실패 : 87"

I 오류 코드 87 인터넷 검색을하고 "잘못된 매개 변수"를 말한다. 나는 2032 년과 같은 긍정적 인 프로세스 ID에 대해 무언가가 무효가 될지 모르겠다. 어떤 아이디어입니까?

답변

4

PID에 OpenProcess을 사용하는 대신 CreateProcess에서 핸들을 사용해야합니다.

OpenProcess은 프로세스 개체가 여전히 존재하는 경우에만 작동합니다. 프로세스 개체가 사라지면 OpenProcess으로 전화 할 때까지 결과가 유효하지 않은 매개 변수로 호출됩니다.

다른 유틸리티를 사용하여 얻은 성공은 경쟁 조건 (몇 번 실패 할 수 있음) 또는 하위 프로세스의 원래 핸들을 열어 두었 기 때문입니다.

0

게시물은 오래되었지만 프로세스가 있지만 다른 사용자 및/또는 Windows 데스크톱 및/또는 터미널 서버 세션에서 소유 한 경우 ERROR_INVALID_PARAMETER을 발견했습니다.

이상하게도 WTSEnumerateProcess() 함수는이 오류를 겪지 않지만, 특히 많은 프로세스에서 이미 많은 부하를 받고있는 시스템에서 (그리고 내 Windows 커널 리소스를 소모한다고해도) 훨씬 더 비쌉니다.

따라서 '실제'잘못된 매개 변수를 제공하고 오류에 액세스 할 수 없습니다. 내가 대신 ERROR_ACCESS_DENIED을 기대했을 것입니다 (그러나 일반/비 승계 사용자로 호출 된 작업 관리자는 여전히 모든 프로세스를 보여줍니다).

Windows에서 불일치가있는 것처럼 보입니까?

관련 문제