internal static IEnumerable <CpuStatistics> GetAll() { var statReader = new Utf8FileReader(StatPath, 4096); try { while (!statReader.EndOfStream) { var cpuStr = statReader.ReadWord(); if (!cpuStr.StartsWith(CpuNumberStart.Span)) { yield break; } var cpuNumberStr = cpuStr.Slice(CpuNumberStart.Length); short?cpuNumber; if (cpuNumberStr.Length == 0) { cpuNumber = null; } else { Utf8Parser.TryParse(cpuNumberStr, out short num, out _); cpuNumber = num; } var ticksPerSecond = (double)ProcFs.TicksPerSecond; var userTime = statReader.ReadInt64() / ticksPerSecond; var niceTime = statReader.ReadInt64() / ticksPerSecond; var kernelTime = statReader.ReadInt64() / ticksPerSecond; var idleTime = statReader.ReadInt64() / ticksPerSecond; statReader.SkipWord(); var irqTime = statReader.ReadInt64() / ticksPerSecond; var softIrqTime = statReader.ReadInt64() / ticksPerSecond; statReader.SkipLine(); yield return(new CpuStatistics { CpuNumber = cpuNumber, UserTime = userTime, NiceTime = niceTime, KernelTime = kernelTime, IdleTime = idleTime, IrqTime = irqTime, SoftIrqTime = softIrqTime }); } } finally { statReader.Dispose(); } }
public void Refresh() { _initialized = false; _commandLine = null; _startTimeUtc = null; var statReader = new Utf8FileReader($"{ProcFs.RootPath}/{Pid}/stat", 512); try { // See http://man7.org/linux/man-pages/man5/proc.5.html /proc/[pid]/stat section // (1) pid statReader.SkipWord(); // (2) name var name = statReader.ReadWord(); _name = name.Slice(1, name.Length - 2).ToUtf8String(); // (3) state _state = GetProcessState((char)statReader.ReadWord()[0]); // (4) ppid _parentPid = statReader.ReadInt32(); // (5) pgrp _groupId = statReader.ReadInt32(); // (6) session _sessionId = statReader.ReadInt32(); // (7) tty_nr statReader.SkipWord(); // (8) tpgid statReader.SkipWord(); // (9) flags statReader.SkipWord(); // (10) minflt _minorFaults = statReader.ReadInt64(); // (11) cminflt statReader.SkipWord(); // (12) majflt _majorFaults = statReader.ReadInt64(); // (13) cmajflt statReader.SkipWord(); // (14) utime _userProcessorTime = statReader.ReadInt64() / (double)ProcFs.TicksPerSecond; // (15) stime _kernelProcessorTime = statReader.ReadInt64() / (double)ProcFs.TicksPerSecond; // (16) cutime statReader.SkipWord(); // (17) cstime statReader.SkipWord(); // (18) priority _priority = statReader.ReadInt16(); // (19) nice _nice = statReader.ReadInt16(); // (20) num_threads _threadCount = statReader.ReadInt32(); // (21) itrealvalue statReader.SkipWord(); // (22) starttime _startTimeTicks = statReader.ReadInt64(); // (23) vsize _virtualMemorySize = statReader.ReadInt64(); // (24) rss _residentSetSize = statReader.ReadInt64() * Environment.SystemPageSize; } finally { statReader.Dispose(); } _initialized = true; }