CProcessStatisticsReader.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include "CProcessStatisticsReader.h"
  2. #include "CFile.h"
  3. #include <pwd.h>
  4. #include <stdio.h>
  5. CProcessStatisticsReader::CProcessStatisticsReader()
  6. {
  7. setpwent();
  8. while (auto* passwd = getpwent())
  9. m_usernames.set(passwd->pw_uid, passwd->pw_name);
  10. endpwent();
  11. }
  12. HashMap<pid_t, CProcessStatistics> CProcessStatisticsReader::get_map()
  13. {
  14. HashMap<pid_t, CProcessStatistics> res;
  15. update_map(res);
  16. return res;
  17. }
  18. void CProcessStatisticsReader::update_map(HashMap<pid_t, CProcessStatistics>& map)
  19. {
  20. CFile file("/proc/all");
  21. if (!file.open(CIODevice::ReadOnly)) {
  22. fprintf(stderr, "CProcessHelper : failed to open /proc/all: %s\n", file.error_string());
  23. return;
  24. }
  25. for (;;) {
  26. auto line = file.read_line(1024);
  27. if (line.is_empty())
  28. break;
  29. auto chomped = String((const char*)line.pointer(), line.size() - 1, Chomp);
  30. auto parts = chomped.split_view(',');
  31. if (parts.size() < 18)
  32. break;
  33. bool ok = false;
  34. CProcessStatistics process;
  35. process.pid = parts[0].to_uint(ok);
  36. if (!ok) {
  37. fprintf(stderr, "CProcessHelper : couldn't convert %s to a valid pid\n", parts[0].characters());
  38. return;
  39. }
  40. process.nsched = parts[1].to_uint(ok);
  41. if (!ok) {
  42. fprintf(stderr, "CProcessHelper : couldn't convert %s to a valid nsched value\n", parts[1].characters());
  43. return;
  44. }
  45. uid_t uid = parts[5].to_uint(ok);
  46. if (!ok) {
  47. fprintf(stderr, "CProcessHelper : couldn't convert %s to a valid uid value\n", parts[5].characters());
  48. return;
  49. }
  50. process.uid = uid;
  51. process.username = get_username_from_uid(uid);
  52. process.priority = parts[16];
  53. process.syscalls = parts[17].to_uint(ok);
  54. if (!ok) {
  55. fprintf(stderr, "CProcessHelper : couldn't convert %s to a valid syscalls count value\n", parts[17].characters());
  56. return;
  57. }
  58. process.state = parts[7];
  59. process.name = parts[11];
  60. process.virtual_size = parts[12].to_uint(ok);
  61. if (!ok) {
  62. fprintf(stderr, "CProcessHelper : couldn't convert %s to a valid amount of virtual address space used\n", parts[12].characters());
  63. return;
  64. }
  65. process.physical_size = parts[13].to_uint(ok);
  66. if (!ok) {
  67. fprintf(stderr, "CProcessHelper : couldn't convert %s to a valid amount of physical address space used\n", parts[13].characters());
  68. return;
  69. }
  70. map.set(process.pid, process);
  71. }
  72. }
  73. String CProcessStatisticsReader::get_username_from_uid(const uid_t uid)
  74. {
  75. auto it = m_usernames.find(uid);
  76. if (it != m_usernames.end())
  77. return (*it).value;
  78. else
  79. return String::format("%u", uid);
  80. }