Функция get_parent_pid, судя по контексту и вашему коду, должна возвращать идентификатор родительского процесса для переданного ей идентификатора процесса current. В Linux это можно сделать, прочитав соответствующий файл в файловой системе /proc, которая предоставляет информацию о запущенных процессах.
Вот как можно реализовать функцию get_parent_pid:
- Открыть файл
/proc/<current>/stat, где <current> — это переданный идентификатор процесса.
- Прочитать содержимое файла.
- Извлечь из содержимого файла идентификатор родительского процесса (PPID).
Формат строки в файле /proc/<pid>/stat имеет следующий вид:
pid (comm) state ppid ...
Вот пример реализации функции get_parent_pid на языке C:
#include <stdio.h>
#include <stdlib.h>
pid_t get_parent_pid(pid_t current) {
char path[256];
snprintf(path, sizeof(path), "/proc/%d/stat", current);
FILE *file = fopen(path, "r");
if (!file) {
perror("fopen");
return -1; // или другое значение, указывающее на ошибку
}
pid_t ppid;
// Считываем информацию, нам нужно только pid, comm, state и ppid.
// В строке stat, это: 1 2 3 4 5 6 7 8 9 10 ...
// Поэтому, мы можем пропустить ненужные поля, считывая необходимые.
fscanf(file, "%*d %*s %*s %d", &ppid);
fclose(file);
return ppid;
}
Объяснение:
snprintf формирует путь к файлу /proc/<current>/stat.
fopen открывает файл для чтения. Если файл не может быть открыт (например, если процесс завершился), возвращается ошибка.
fscanf считывает нужные поля. Мы пропускаем ненужные поля, используя формат %*s и считываем идентификатор родительского процесса ppid.
- После считывания идентификатора, файл закрывается, и мы возвращаем значение
ppid.
Тогда основная функция print_process_parents может использовать get_parent_pid, чтобы напечатать всех предков процесса, начиная с переданного идентификатора pid, пока не дойдет до процесса с идентификатором 1 (обычно init).