16 Jul
2009
Posted in: 코드
By    5 Comments

프로세스 생성 버그…


프로세스 생성 버그…
by 신영진(YoungJin Shin), codewiz at gmail.com, @codemaru, http://www.jiniya.net

마소 원고를 쓰고 있었습니다. 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 상황입니다.

ps

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




  • 트랙백 주소: http://www.jiniya.net/wp/archives/256/trackback

관련 글

5 Comments

  • 균일하게 증가하는 노란색 그래프 하며, 일관적인 보라색 영역이 예술적이네요 ㅎㅎ

  • ㅋ 자기 복제 바이러스를 만들었네요 ㅋ~

    근데 이건 다른 주제인데…
    WaitForSingleObject(sei.hProcess, INFINITE);

    INFINITE 를 쓰는것과 …
    충분히 큰 시간이라고 생각되는 TIMEOUT 을 주는것과…

    어떤것이 좋은 코드일까요??
    논리적이라면 INFINITE 이여야겠지만…

    항상 못미더워하며 TIMEOUT 을 주고싶어한다는… -.-;

  • 멋져요~~ㅋㅋㅋ -0-b.

  • INFINITE 에 한표…

    TIMEOUT 을 쓰는 그 순간 부터… 마음 한켠의 자리잡는 불안함 과 기타 동기화와 관련된 이슈에서 문제의 소지가 잠재되어 있을 거라는 일말의 역시 불안감…

    불안해서… INFINITE 에 한표…

  • ㅋ~ 꺼꾸로네요..
    INFINITE 면… 영원히 잠들고 있을지도… 켁~ 프로그램 잘못짠거죠. ㅋ~

댓글을 달아주세요. 악플보다 무서운게 무플입니다 ㅋ~