9 char *get_name_by_pid(int pid)
12 static char cmdline[128];
18 if (read_cmdline(pid, pid, cmdline, sizeof(cmdline))) {
23 bname = basename(cmdline);
29 static int parse_pid(DIR **dir)
31 struct dirent *dirent;
35 dirent = readdir(*dir);
43 printf("Failed to read /proc directory: %s\n", strerror(error));
47 if (dirent->d_name[0] < '0' || dirent->d_name[0] > '9')
50 return atoi(dirent->d_name);
53 static int opendir_check(DIR **dir, const char *path)
61 fprintf(stderr, "Failed to open %s directory: %s\n",
62 path, strerror(error));
70 int get_next_tid(int pid, DIR **dir)
75 snprintf(path, sizeof(path), "/proc/%d/task/", pid);
76 if (opendir_check(dir, path))
80 return parse_pid(dir);
83 int get_next_pid(DIR **dir)
85 if (opendir_check(dir, "/proc"))
88 return parse_pid(dir);
91 int get_next_pid_by_name(DIR **dir, char *name)
96 if (opendir_check(dir, "/proc"))
100 pid = parse_pid(dir);
104 pname = get_name_by_pid(pid);
107 if (strcmp(pname, name))
116 int read_cmdline(int pid, int tid, char *cmdline, size_t len)
122 snprintf(path, sizeof(path), "/proc/%d/task/%d/cmdline", pid, tid);
123 file = fopen(path, "rb");
128 ret = fread(cmdline, 1, len, file);
130 cmdline[ret - 1] = 0;
133 return ret > 0 ? 0 : -1;