프로세스 이미지 이름을 통해 프로세스를 종료하는 간단한 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
호출에 필요하지 않습니다OpenProcess
만PROCESS_TERMINATE
.OpenProcess()
및 의 반환 값은TerminateProcess()
확인되지 않습니다. 실패하면 진단 메시지를 기대합니다. 특히,TerminateProcess()
그리고CloseHandle()
경우에만 호출합니다OpenProcess()
성공했다.- 맛의 문제 일 수 있지만
== TRUE
부울 조건 확인시 생략 할 수 있습니다. - 이 도구의 사용자로서 나는 일치하는 프로세스가 발견되었는지, 얼마나 많은 프로세스가 죽었는지에 대한 피드백을 기대합니다.