商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > go语言windows下进程信息获取实现方式

go语言windows下进程信息获取实现方式

  发布于2026-07-12 阅读(0)

扫一扫,手机访问

一、获取当前进程时间信息

在 Windows 平台下开发时,经常需要拿到进程的创建时间、退出时间、内核态时间和用户态时间。Go 语言标准库中的 syscall 包已经封装了对应的系统调用,直接调用 GetProcessTimes 就能拿到这些数据。操作很简单:先通过 syscall.GetCurrentProcess() 拿到当前进程的句柄,然后调用 GetProcessTimes 把结果填充到四个 Filetime 结构体里。最后用 Nanoseconds() 转成纳秒,方便打印或计算。下面这段代码就是完整的实现示例:

import (
	"syscall"
	"fmt"
)

var (
		creationTime syscall.Filetime
		exitTime     syscall.Filetime
		kernelTime   syscall.Filetime
		userTime     syscall.Filetime
	)

	h, err := syscall.GetCurrentProcess()
	if err != nil {
		fmt.Println(err)
		return
	}

	err = syscall.GetProcessTimes(h, &creationTime, &exitTime, &kernelTime, &userTime)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("CreationTime: %v\nExitTime: %v\nKernelTime: %v\nUserTime: %v\n", creationTime.Nanoseconds(), exitTime.Nanoseconds(), kernelTime.Nanoseconds(), userTime.Nanoseconds())

细心的读者可能会问:那如果我想获取其他进程的时间信息呢?别急,第二步就是讲这个。

二、获取进程id

要获取任意进程的时间信息,第一步得先拿到进程的 PID。常用的方法有两种:一是当前进程直接用 syscall.Getpid();二是系统所有进程,推荐用 gopsutil/process 这个第三方库,它封装了跨平台的进程枚举逻辑。

拿到 PIDs 列表后,可以遍历每个 PID,通过 process.NewProcess(pid) 创建一个进程对象,然后用 pn.Name() 获取进程名。如果想针对特定进程(比如 main.exe)做过滤,就在循环里做个字符串比较。确认目标后,调用 syscall.OpenProcess 打开进程句柄(注意权限要足够),接着复用刚才的 GetProcessTimes 获取时间信息。最后记得关闭句柄。

下面这段代码演示了如何枚举所有进程,筛选出名为 main.exe 的进程,并打印它的 PID 以及创建时间的毫秒数:

import (
	"fmt"
	"strings"
	"syscall"
	"time"

	"github.com/shirou/gopsutil/process"
)
// 获取当前进程pid
pid := syscall.Getpid()
fmt.Println("mypid:", pid)
// 获取系统所有进程id
pids, _ := process.Pids()
for _, pid := range pids {
	// 根据进程id实例化每个进程
	pn, _ := process.NewProcess(pid)
	pName, _ := pn.Name()
	// 过滤进程名为main.exe的进程信息
	if 0 != strings.Compare(pName, "main.exe") {
		continue
	}
	// 获取进程所在路径
	_, _ = pn.Cwd()
	h, err := syscall.OpenProcess(syscall.STANDARD_RIGHTS_REQUIRED|syscall.SYNCHRONIZE|0xfff, 	false, uint32(pid))
	if err != nil {
		fmt.Println(err)
		return
	}
	defer syscall.CloseHandle(h)
	err = syscall.GetProcessTimes(h, &creationTime, &exitTime, &kernelTime, &userTime)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("pid:", pid, ",milliseconds:", creationTime.Nanoseconds()/1000000)
}
_, err = process.Processes()
if err != nil {
	fmt.Println(err.Error())
	return
}

总结

在 Windows 下用 Go 获取进程时间信息,核心就是 syscall.GetProcessTimes 这个函数。对于当前进程,直接获取句柄调用即可;对于其他进程,则需要先通过进程名或 PID 拿到句柄,再执行同样的操作。配合 gopsutil 库做进程枚举,几乎可以覆盖所有常见的监控需求。如果你的项目中需要记录进程启动时间、CPU 耗时或者崩溃时刻,这个方案足够轻量且高效。

go语言windows下进程信息获取实现方式

本文转载于:https://www.jb51.net/jiaoben/362914a82.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注