Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 3
0
        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));
 }