【问题标题】:List of currently running process in golang, Windows versiongolang中当前运行的进程列表,windows版本
【发布时间】:2012-07-06 05:23:12
【问题描述】:

如何获取Windows下golang中当前运行的进程列表?

我需要类似的东西:

List of currently running process in Golang

但也可以在 Windows 下使用。

【问题讨论】:

    标签: windows go winapi


    【解决方案1】:

    我刚刚实现了您需要的功能(EnumProcess 如上所述的 axw)。 查看https://github.com/AllenDang/w32。您可能要等到我的拉取请求通过 :) 使用示例:https://gist.github.com/3083408

    【讨论】:

      【解决方案2】:

      您需要使用 Windows API 函数EnumProcesses。 Windows 上的 syscall 包允许您加载任意 DLL 及其函数(即通过 LoadLibrary/GetProcAddress)。所以你可以在psapi.dll 中找到EnumProcesses。这为您提供了一个 PID 列表;然后您可以使用 OpenProcess 和 EnumProcessModules 来获取进程名称。

      可能有人已经完成了实现这一点的工作,但我什么都不知道。如果找不到任何东西,请查看 syscall 包的源代码(例如,src/pkg/syscall/zsyscall_windows_386.go)并执行与其他 Windows API 函数类似的操作。

      【讨论】:

        【解决方案3】:

        根据系统调用包文档:此包已锁定。标准 Go 存储库之外的代码应迁移到使用 golang.org/x/sys 存储库中的相应包。

        你可以使用 golang.org/x/sys/windows,它有 Process32First 和 Process32Next 来让枚举系统进程。

        【讨论】:

          【解决方案4】:

          这似乎可以做到:

          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

          【讨论】:

          • 别忘了defer windows.CloseHandle(h)
          【解决方案5】:

          如果使用Windigo,代码会更简洁(为简洁起见,省略了错误检查):

          package main
          
          import (
              "fmt"
          
              "github.com/rodrigocfd/windigo/win"
              "github.com/rodrigocfd/windigo/win/co"
          )
          
          func main() {
              pids, _ := win.EnumProcesses()
          
              for _, pid := range pids {
                  hSnap, _ := win.CreateToolhelp32Snapshot(co.TH32CS_SNAPMODULE, pid)
                  defer hSnap.CloseHandle()
          
                  hSnap.EnumModules(func(me32 *win.MODULEENTRY32) {
                      fmt.Printf("PID: %d, %s @ %s\n",
                          me32.Th32ProcessID, me32.SzModule(), me32.SzExePath())
                  })
              }
          }
          

          或者,如果您只想要流程,而不需要模块:

          package main
          
          import (
              "fmt"
          
              "github.com/rodrigocfd/windigo/win"
              "github.com/rodrigocfd/windigo/win/co"
          )
          
          func main() {
              pids, _ := win.EnumProcesses()
          
              for _, pid := range pids {
                  hSnap, _ := win.CreateToolhelp32Snapshot(co.TH32CS_SNAPPROCESS, pid)
                  defer hSnap.CloseHandle()
          
                  hSnap.EnumProcesses(func(pe32 *win.PROCESSENTRY32) {
                      fmt.Printf("PID: %d @ %s\n",
                          pe32.Th32ProcessID, pe32.SzExeFile())
                  })
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2012-02-20
            • 2015-10-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-17
            相关资源
            最近更新 更多