मैं विंडोज वातावरण में प्रक्रिया नाम से प्रक्रिया आईडी प्राप्त करना चाहता हूं?प्रक्रिया नाम से प्रक्रिया आईडी कैसे प्राप्त करें?
मुझे लगता है कि गोलांग में केवल एपीआई os.FindProcess(id)
है, लेकिन नाम से नहीं।
मैं विंडोज वातावरण में प्रक्रिया नाम से प्रक्रिया आईडी प्राप्त करना चाहता हूं?प्रक्रिया नाम से प्रक्रिया आईडी कैसे प्राप्त करें?
मुझे लगता है कि गोलांग में केवल एपीआई os.FindProcess(id)
है, लेकिन नाम से नहीं।
आप सभी प्रक्रियाओं को सूचीबद्ध कर सकते हैं और उन नामों से मिलान कर सकते हैं जिन्हें आप खोजना चाहते हैं, अद्यतन sys कॉल पैकेज, https://godoc.org/golang.org/x/sys, का उपयोग करके इसमें अधिकांश विंडोज़ एपीआई हैं।
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
मैं भी इस के साथ संघर्ष करना पड़ा, और, समाधान बहुत स्पष्ट नहीं करने के लिए रास्ता मिल गया है क्योंकि ... WINAPI :)
अंत में आपको CreateToolhelp32Snapshot
का उपयोग कर वर्तमान विंडोज़ प्रक्रिया सूची का स्नैपशॉट बनाना होगा। फिर आपको Process32First
के साथ स्नैपशॉट में पहली प्रक्रिया मिलती है। उसके बाद Process32Next
के साथ सूची में पुनरावृत्त रहें, जब तक आपको ERROR_NO_MORE_FILES
त्रुटि न मिल जाए। केवल तभी आपके पास पूरी प्रक्रिया सूची है।
एक उदाहरण उदाहरण के लिए 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]),
}
}
आप अपने golang कार्यक्रम के अंदर 'tasklist.exe' निष्पादित और golang में उत्पादन की प्रक्रिया प्रक्रिया नाम खोजने के लिए कर सकते हैं:
यहाँ सार है। – Griffin