Windowsのgolangで現在実行中のプロセスのリストを取得するにはどうすればよいですか?
私は次のようなものが必要です:
しかし、Windowsでも使用できます。
Windowsのgolangで現在実行中のプロセスのリストを取得するにはどうすればよいですか?
私は次のようなものが必要です:
しかし、Windowsでも使用できます。
必要な関数を実装しました(上記のaxwとしてのEnumProcess)。https://github.com/AllenDang/w32をチェックしてください。プルリクエストが完了するまで待つことをお勧めします:)使用方法の例:https ://gist.github.com/3083408
Windows API 関数を使用する必要がありますEnumProcesses
。Windowsのsyscallパッケージを使用すると、任意の DLL とその関数をロードできます (つまり、LoadLibrary/GetProcAddress を介して)。EnumProcesses
に入ることができますpsapi.dll
。これにより、PID のリストが表示されます。その後、OpenProcess と EnumProcessModules を使用してプロセス名を取得できます。
誰かがこれを実装する作業を既に行っている可能性がありますが、私は何も知りません。何も見つからない場合は、syscall パッケージのソース (たとえば、src/pkg/syscall/zsyscall_windows_386.go ) を調べて、他の Windows API 関数に対して行われたことと同様のことを行います。
syscall パッケージのドキュメントによると、このパッケージはロックされています。標準の Go リポジトリ外のコードは、golang.org/x/sys リポジトリ内の対応するパッケージを使用するように移行する必要があります。
golang.org/x/sys/windows を使用できます。これには、システム プロセスを列挙するための Process32First と Process32Next があります。
これはそれを行うようです:
package main
import "golang.org/x/sys/windows"
// unsafe.Sizeof(windows.ProcessEntry32{})
const processEntrySize = 568
func main() {
h, e := windows.CreateToolhelp32Snapshot(windows.TH32CS_SNAPPROCESS, 0)
if e != nil {
panic(e)
}
p := windows.ProcessEntry32{Size: processEntrySize}
for {
e := windows.Process32Next(h, &p)
if e != nil { break }
s := windows.UTF16ToString(p.ExeFile[:])
println(s)
}
}
https://pkg.go.dev/golang.org/x/sys/windows#CreateToolhelp32Snapshot