staros/memory_unix.go
starainrt d93a851d1b
feat: 完善 staros 系统能力并更新 wincmd 发布版依赖
- 重构 sysconf 为文档模型 INI Parser 与 Config Framework
- 强化 hosts 解析、插入校验、写回与异常输入处理
- 完善 StarCmd 生命周期、等待 API、流式输出与 IO 重定向
- 扩展跨平台文件时间、文件锁、内存、进程与网络能力
- 将 Windows 进程适配更新到 b612.me/wincmd v0.1.0
- 移除本地 wincmd/win32api replace,改用发布版依赖
- 将最低 Go 版本提升到 1.18
- 补充 hosts、sysconf、FileLock、StarCmd 与平台适配回归测试
2026-06-09 18:10:19 +08:00

57 lines
1.2 KiB
Go

//go:build linux
// +build linux
package staros
import (
"io/ioutil"
"strconv"
"strings"
"syscall"
)
// Memory 系统内存信息
func Memory() (MemStatus, error) {
var mem MemStatus
ram := new(syscall.Sysinfo_t)
if err := syscall.Sysinfo(ram); err != nil {
return mem, err
}
unit := uint64(ram.Unit)
if unit == 0 {
unit = 1
}
mem.All = uint64(ram.Totalram) * unit
mem.BuffCache = uint64(ram.Bufferram) * unit
mem.Free = uint64(ram.Freeram) * unit
mem.Shared = uint64(ram.Sharedram) * unit
mem.Available = mem.Free + mem.Shared + mem.BuffCache
if available, ok := linuxMemAvailable(); ok {
mem.Available = available
}
mem.SwapAll = uint64(ram.Totalswap) * unit
mem.SwapFree = uint64(ram.Freeswap) * unit
mem.SwapUsed = uint64(mem.SwapAll - mem.SwapFree)
mem.Used = uint64(mem.All - mem.Free)
return mem, nil
}
func linuxMemAvailable() (uint64, bool) {
data, err := ioutil.ReadFile("/proc/meminfo")
if err != nil {
return 0, false
}
for _, line := range strings.Split(string(data), "\n") {
fields := strings.Fields(line)
if len(fields) < 2 || fields[0] != "MemAvailable:" {
continue
}
value, err := strconv.ParseUint(fields[1], 10, 64)
if err != nil {
return 0, false
}
return value * 1024, true
}
return 0, false
}