프로세스 이미지 이름을 통해 프로세스를 종료하는 간단한 C WinAPI 프로그램

Aug 20 2020

(또한 다음 반복을 참조하십시오 .)

각각의 프로세스 이미지 이름 ( .exe파일)을 통해 프로세스를 종료하는이 작은 프로그램이 있습니다.

#include <stdio.h>
#include <windows.h>
#include <TlHelp32.h>

int main(int argc, char* argv[]) {
    if (argc != 2) {
        puts("processkiller.exe PROCESS_NAME");
        return EXIT_SUCCESS;
    }

    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

    if (Process32First(snapshot, &entry) == TRUE) {
        while (Process32Next(snapshot, &entry) == TRUE) {
            if (strcmp(entry.szExeFile, argv[1]) == 0) {
                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 
                                              FALSE, 
                                              entry.th32ProcessID);
                TerminateProcess(hProcess, 0);
                CloseHandle(hProcess);
            }
        }
    }

    CloseHandle(snapshot);
    return EXIT_SUCCESS;
}

processkiller.exe요청 된 프로세스를 실제로 종료하려면 관리자 모드에서 실행해야 합니다.

비평 요청

떠오르는 것이 있으면 알려주세요.

답변

4 MartinR Aug 20 2020 at 19:37

미묘한 버그가 있습니다.

Process32First(snapshot, &entry)

이미 entry스냅 샷의 첫 번째 프로세스에 대한 정보로 채워져 있습니다. Process32Next()즉시 호출 되기 때문에 코드가 해당 항목을 놓칩니다 . 루프 구조는

if (Process32First(snapshot, &entry) == TRUE) {
    do {
        // ... do something with `entry`...
        
    } while (Process32Next(snapshot, &entry) == TRUE);
}

대신. 내 마음에 떠오르는 다른 것들 :

  • 프로그램이 잘못된 수의 인수로 호출되면 오류 / 사용 메시지가 표준 오류에 인쇄되어야하며 프로그램은 0이 아닌 종료 코드 (예 :)로 종료 되어야합니다 EXIT_FAILURE.
  • 의 반환 값은 CreateToolhelp32Snapshot()확인되지 않습니다.
  • PROCESS_ALL_ACCESS호출에 필요하지 않습니다 OpenProcessPROCESS_TERMINATE.
  • OpenProcess()및 의 반환 값은 TerminateProcess()확인되지 않습니다. 실패하면 진단 메시지를 기대합니다. 특히, TerminateProcess()그리고 CloseHandle()경우에만 호출합니다 OpenProcess()성공했다.
  • 맛의 문제 일 수 있지만 == TRUE부울 조건 확인시 생략 할 수 있습니다.
  • 이 도구의 사용자로서 나는 일치하는 프로세스가 발견되었는지, 얼마나 많은 프로세스가 죽었는지에 대한 피드백을 기대합니다.