В Linux-проекте, над которым я работаю, мне нужно найти все мои дочерние процессы. Невозможно записывать каждый раз, когда он запускается - их нужно найти после факта. Это должно быть чисто C, и я бы хотел сделать это без чтения /proc. Кто-нибудь знает, как это сделать?
Как найти все дочерние процессы?
Ответ 1
Я нахожу ваш комментарий, что не представляется возможным записать создание процессов как нечетное, но если вы действительно не можете (возможно, потому, что вы не знаете, сколько будет создано и не захочет сохраняйте realloc
ing memory), тогда я, вероятно, открою все файлы, соответствующие glob /proc/[1-9]*/status
, и найдите строку, которая говорит PPid: <num>
, где <num>
был моим идентификатором процесса.
Ответ 2
Как правило, вполне возможно записывать дочерние процессы каждый раз, когда вы его запускаете. удобно, родительскому процессу передается значение pid дочернего процесса как возвращаемое значение вызова fork, который его создает.
Как говорится в man-странице:
pid_t fork(void);
Это поможет, если вы скажете нам, почему вы считаете это невозможным.
Ответ 3
Вы можете использовать popen
Что-то вроде. (Надеюсь, синтаксис достаточно близко)
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fp = popen("ps -C *YOUR PROGRAM NAME HERE* --format '%P %p'" , "r"); if (fp == NULL) { printf("ERROR!\n"); } char parentID[256]; char processID[256]; while (fscanf(fp, "%s %s", parentID, processID) != EOF) { printf("PID: %s Parent: %s\n", processID, parentID); // Check the parentID to see if it that of your process } pclose(fp); return 1; }
Ответ 4
Вы можете попробовать это
#include<string.h>
#include <sys/types.h>
#include <unistd.h>
char str[50] = "ps -o pid --ppid ";
char ppid [7];
sprintf(ppid,"%d",getpid());
strcat(str,ppid);
system(str);
ПРИМЕЧАНИЕ. Этот фрагмент кода должен находиться в родительском процессе.
В принципе ps -o pid --ppid <parent_id>
дает pid всех дочерних процессов, у родителя которых есть PID. Теперь мы можем получить PID родительского процесса, используя getpid(), который возвращает pid_t
и неявно преобразован в integer.sprintf, преобразует его в строку, и мы объединяем результат с помощью str
, чтобы получить полную команду, которая выполняется system()
Ответ 5
Вы можете проанализировать список процессов (ps -ax?), который включал родительский идентификатор процесса. Вероятно, это можно сделать с помощью простой оболочки script.
Ответ 6
Если вы хотите отслеживать события fork и извлекать дочерние pids для целей отладки, существует несколько способов сделать это, включая:
- Использование GDB
- Использование strace
- Использование systemtap
- Использование соединителей событий ядра (не уверен, что это точно)
Ответ 7
Если вы пытаетесь получить все дочерние процессы для конкретной цели, ожидая их выхода, вы можете использовать waitpid (-1,...):
while (true) {
// Wait for any child exiting
int child_status;
const int child_pid = waitpid(-1, &child_status, 0);
// check child_status
}