구글링중 찾은 코드를 조금 손봤습니다. 프로세스명(실행파일명)으로 프로세스가 있는지를 체크하는 함수와 프로세스를 죽이는 함수인데..
os.FindProcess 로 Kill 하는게 윈도서도 제대로 될진 모르겠네요 ㅎㅎ
findProcessByName 까진 정상동작 확인했습니다.
Go
package main
import (
"os"
"strings"
"syscall"
"unsafe"
"golang.org/x/sys/windows"
)
const TH32CS_SNAPPROCESS = 0x00000002
type WindowsProcess struct {
ProcessID int
ParentProcessID int
Exe string
}
/**
* processes
**/
func processes() ([]WindowsProcess, error) {
handle, err := windows.CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
if err != nil {
return nil, err
}
defer windows.CloseHandle(handle)
var entry windows.ProcessEntry32
entry.Size = uint32(unsafe.Sizeof(entry))
<em>// get the first process</em>
err = windows.Process32First(handle, &entry)
if err != nil {
return nil, err
}
results := make([]WindowsProcess, 0, 50)
for {
results = append(results, newWindowsProcess(&entry))
err = windows.Process32Next(handle, &entry)
if err != nil {
<em>// windows sends ERROR_NO_MORE_FILES on last process</em>
if err == syscall.ERROR_NO_MORE_FILES {
return results, nil
}
return nil, err
}
}
}
/**
* findProcessByName
**/
func findProcessByName(name string) *WindowsProcess {
processes, perr := processes()
if perr != nil {
return nil
}
for _, p := range processes {
if strings.ToLower(p.Exe) == strings.ToLower(name) {
return &p
}
}
return nil
}
/**
* newWindowsProcess
**/
func newWindowsProcess(e *windows.ProcessEntry32) WindowsProcess {
<em>// Find when the string ends for decoding</em>
end := 0
for {
if e.ExeFile[end] == 0 {
break
}
end++
}
return WindowsProcess{
ProcessID: int(e.ProcessID),
ParentProcessID: int(e.ParentProcessID),
Exe: syscall.UTF16ToString(e.ExeFile[:end]),
}
}
/**
* killProcess
**/
func killProcess(name string) {
pn := findProcessByName(name)
if pn != nil {
p, perr := os.FindProcess(pn.ProcessID)
if perr == nil {
p.Kill()
}
}
}