github.com/PandaGoAdmin/utils@v0.0.0-20211208134815-d5461603a00f/os_darwin_cgo.go (about) 1 // +build darwin 2 // +build cgo 3 4 package kgo 5 6 // #include <stdlib.h> 7 // #include <libproc.h> 8 // #include <mach/mach_host.h> 9 // #include <mach/host_info.h> 10 import "C" 11 import ( 12 "unsafe" 13 ) 14 15 // 获取CPU使用率(darwin系统必须使用cgo),单位jiffies(节拍数). 16 // user为用户态(用户进程)的运行时间, 17 // idle为空闲时间, 18 // total为累计时间. 19 func (ko *LkkOS) CpuUsage() (user, idle, total uint64) { 20 var cpuLoad C.host_cpu_load_info_data_t 21 var count C.mach_msg_type_number_t = C.HOST_CPU_LOAD_INFO_COUNT 22 ret := C.host_statistics(C.host_t(C.mach_host_self()), C.HOST_CPU_LOAD_INFO, C.host_info_t(unsafe.Pointer(&cpuLoad)), &count) 23 if ret != C.KERN_SUCCESS { 24 return 25 } 26 27 user = uint64(cpuLoad.cpu_ticks[C.CPU_STATE_USER]) 28 idle = uint64(cpuLoad.cpu_ticks[C.CPU_STATE_IDLE]) 29 total = user + idle + uint64(cpuLoad.cpu_ticks[C.CPU_STATE_SYSTEM]) + uint64(cpuLoad.cpu_ticks[C.CPU_STATE_NICE]) 30 31 return 32 } 33 34 // getProcessPathByPid 根据PID获取进程的执行路径. 35 func getProcessPathByPid(pid int) (res string) { 36 var c C.char // need a var for unsafe.Sizeof need a var 37 const bufsize = C.PROC_PIDPATHINFO_MAXSIZE * unsafe.Sizeof(c) 38 buffer := (*C.char)(C.malloc(C.size_t(bufsize))) 39 defer C.free(unsafe.Pointer(buffer)) 40 41 ret, err := C.proc_pidpath(C.int(pid), unsafe.Pointer(buffer), C.uint32_t(bufsize)) 42 if err != nil { 43 return 44 } 45 if ret <= 0 { 46 return 47 } 48 49 return C.GoString(buffer) 50 }