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  }