프로세스 생성 버그…

@codemaru · July 16, 2009 · 2 min read

마소 원고를 쓰고 있었습니다. GetExitCodeProcess란 함수를 설명하면서 리턴 되는 ExitCode가 중의적인 의미이기 때문에 해당 값으로만 프로세스가 종료되었다는 것을 판단해서는 안된다는 이야기를 하면서 다음과 같은 예제를 통해서 문제점을 알려주려고 하고 있었습니다.

int _tmain(int argc, _TCHAR* argv[])
{
    if(argc > 1)
        return STILL_ACTIVE;

    SHELLEXECUTEINFO sei;

    ZeroMemory(&sei, sizeof(sei));
    sei.cbSize = sizeof(sei);
    sei.fMask = SEE_MASK_NOCLOSEPROCESS;
    sei.lpVerb = _T("open");
    sei.lpParameters = _T("dummy");
    sei.lpFile = argv[0];
    ShellExecuteEx(&sei);

    WaitForSingleObject(sei.hProcess, INFINITE);

    DWORD ExitCode;
    GetExitCodeProcess(sei.hProcess, &ExitCode);
    if(ExitCode == STILL_ACTIVE)
        printf("아직 실행 중 입니다.\n");

    return 0;
}

예제 코드를 타이핑해서 실행 시켰는데 “아직 실행 중 입니다.” 요 메시지도 나오지 않고, 프로그램도 끝이 안나더군요. 그래서 소스를 봤더니 sei.lpParameters = _T(“dummy”); 이 줄이 빠져 있는게 아니겠습니까. 즉, 무한대로 계속 프로세스를 생성하고 죽지 않는 그놈을 기다리는 말 그대로 운영체제의 프로세스 생성 능력을 테스트하는 프로그램이 되고 말았습니다. 최후의 자식놈을 죽여야 되는데 밑에 부분에서는 프로세스 생성 제한에 걸려서 계속 프로세스가 생겼다 죽었다를 반복하더군요. 결국 루트를 찾아서 죽이는 것은 실패하고, 로그 아웃을 했습니다. 아래는 그 때 제 PC 상황입니다.

           md 0

보다가 너무 웃겨서 포스팅 해 봅니다. ㅋㅋㅋ~

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중