发布于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())
细心的读者可能会问:那如果我想获取其他进程的时间信息呢?别急,第二步就是讲这个。
要获取任意进程的时间信息,第一步得先拿到进程的 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 耗时或者崩溃时刻,这个方案足够轻量且高效。

售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8