- 重构 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 与平台适配回归测试
57 lines
1.2 KiB
Go
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
|
|
}
|