2016-03-31 41 views
5

Windows環境でプロセスIDでプロセスIDを取得したいのですか?プロセス名でプロセスidを取得する方法はありますか?

私はgolangがapi os.FindProcess(id)しか持っていないが、名前は見つからないことがわかりました。

+0

あなたのgolangプログラム内部の「tasklist.exe」を実行し、プロセス名を見つけるためにgolangで出力を処理することができます。 – Griffin

答えて

1

更新されたsys呼び出しパッケージhttps://godoc.org/golang.org/x/sys、 を使用して、すべてのプロセスを一覧表示し、検索する名前と一致させることができます。ほとんどのWindows APIがあります。

func Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) 
func Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) 

また、MSDNのドキュメントを参照してください。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms684834(v=vs.85).aspx

1

ので... WINAPI私は、あまりにもこれと格闘しなければならなかった、と解決への道ではない非常に簡単に見つけ:)

を最後にCreateToolhelp32Snapshotを使用して現在のWindowsプロセスリストのスナップショットを作成する必要があります。次に、Process32Firstでスナップショットの最初のプロセスを取得します。その後、ERROR_NO_MORE_FILESエラーが発生するまで、Process32Nextでリストを繰り返し処理します。それだけであなたはプロセスリスト全体を持っています。

実例はhow2readwindowsprocessesを参照してください。ここで

は、要旨次のとおりです。

const TH32CS_SNAPPROCESS = 0x00000002 

type WindowsProcess struct { 
    ProcessID  int 
    ParentProcessID int 
    Exe    string 
} 

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)) 
    // get the first process 
    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 { 
      // windows sends ERROR_NO_MORE_FILES on last process 
      if err == syscall.ERROR_NO_MORE_FILES { 
       return results, nil 
      } 
      return nil, err 
     } 
    } 
} 

func findProcessByName(processes []WindowsProcess, name string) *WindowsProcess { 
    for _, p := range processes { 
     if strings.ToLower(p.Exe) == strings.ToLower(name) { 
      return &p 
     } 
    } 
    return nil 
} 

func newWindowsProcess(e *windows.ProcessEntry32) WindowsProcess { 
    // Find when the string ends for decoding 
    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]), 
    } 
} 
関連する問題