internal static bool TryReadStatusFile(int pid, out ParsedStatus result, ReusableTextReader reusableReader) { var isParsed = TryParseStatusFile(GetStatusFilePathForProcess(pid), out result, reusableReader); Debug.Assert(!isParsed || result.Pid == pid, "Expected process ID from status file to match supplied pid"); return(isParsed); }
public ProcessInfo[] GetProcessInfos(IEnumerable <int> processIds, Func <ProcessInfo, bool> predicate) { var reusableReader = new ReusableTextReader(); return(processIds.Select(_ => CreateProcessInfo(_, reusableReader)) .Where(_ => _ != null && predicate(_)) .ToArray()); }
internal static bool TryParseStatusFile(string statusFilePath, out ParsedStatus result, ReusableTextReader reusableReader) { string statusFileContents; try { using (var source = new FileStream(statusFilePath, FileMode.Open, FileAccess.Read, FileShare.Read, 1, false)) { statusFileContents = reusableReader.ReadAllText(source); } } catch (IOException) { // Between the time that we get an ID and the time that we try to read the associated stat // file(s), the process could be gone. result = default; return(false); } var results = default(ParsedStatus); var dict = statusFileContents.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries) .Select(_ => ToKeyValue(_, ':')) .ToDictionary(_ => _.Key, _ => _.Value.Trim(' ', '\t')); results.Name = dict.GetValueOrDefault("Name", string.Empty); results.State = dict.GetValueOrDefault("State", " ")[0]; results.Ppid = int.Parse(dict.GetValueOrDefault("PPid", DefaultId)); results.Pid = int.Parse(dict.GetValueOrDefault("Pid", DefaultId)); var uids = dict.GetValueOrDefault("Uid", string.Empty).Split('\t'); if (uids.Length >= 2) { results.Ruid = int.Parse(uids[0]); results.Euid = int.Parse(uids[1]); } else { results.Ruid = results.Euid = -1; } var gids = dict.GetValueOrDefault("Gid", string.Empty).Split('\t'); if (gids.Length >= 2) { results.Rgid = int.Parse(gids[0]); results.Egid = int.Parse(gids[1]); } else { results.Ruid = results.Euid = -1; } result = results; return(true); }
private static ProcessInfo CreateProcessInfo(int pid, ReusableTextReader reusableReader = null) { if (reusableReader == null) { reusableReader = new ReusableTextReader(); } if (!ProcFs.TryReadStatusFile(pid, out var result, reusableReader)) { return(null); } ProcFs.TryReadExeFile(pid, out var exe); ProcFs.TryReadCreationTime(pid, out var startTime); return(CreateProcessInfo(result, exe, startTime)); }