๐Ÿ“ฆ ronitrajfr / rtop

๐Ÿ“„ pid.c ยท 61 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>

#define PROC_PATH_MAX 512

int main()
{
  struct dirent *entry;
  DIR *dir = opendir("/proc"); // Open the /proc directory

  if (dir == NULL)
  {
    perror("opendir");
    return 1;
  }

  printf("PID\tName\t\tState\tMemory (KB)\n");
  printf("-----------------------------------------\n");

  while ((entry = readdir(dir)) != NULL)
  {
    if (isdigit(entry->d_name[0]))
    {
      char file_path[PROC_PATH_MAX];
      snprintf(file_path, PROC_PATH_MAX, "/proc/%s/stat", entry->d_name);

      FILE *fptr = fopen(file_path, "r");
      if (fptr == NULL)
      {
        continue;
      }

      char buffer[1024];
      if (fgets(buffer, sizeof(buffer), fptr) == NULL)
      {
        fclose(fptr);
        continue;
      }

      int pid;
      char comm[256];
      char state;
      long vsize, rss; // Virtual memory & Resident Set Size

      sscanf(buffer, "%d %s %c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %lu %lu",
             &pid, comm, &state, &vsize, &rss);

      fclose(fptr);

      printf("%d\t%-15s\t%c\t%ld KB\n", pid, comm, state, rss * 4);
    }
  }

  closedir(dir);
  return 0;
}