Как найти все дочерние процессы? - PullRequest
14 голосов
/ 18 июня 2009

В проекте на основе Linux, над которым я работаю, мне нужно найти все свои дочерние процессы. Невозможно записывать каждый раз, когда кто-то запускается - их нужно найти по факту. Это должен быть чистый C, и я хотел бы сделать это без чтения / proc. Кто-нибудь знает, как это сделать?

Ответы [ 7 ]

5 голосов
/ 18 июня 2009

Обычно вполне возможно записывать дочерние процессы каждый раз, когда вы запускаете один. для удобства родительскому процессу передается значение pid дочернего процесса в качестве возвращаемого значения вызова fork, который его создает.

Как сказано в справочной странице:

pid_t fork(void);

Было бы полезно, если бы вы могли сказать нам, почему вы думаете, что это невозможно.

5 голосов
/ 18 июня 2009

Вы можете использовать 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 голосов
/ 28 августа 2014

Вы можете попробовать это

#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 <parent_id>. Теперь мы можем получить PID родительского процесса, используя getpid(), который возвращает pid_t и неявно преобразуется в целое число. sprintf() преобразует его в строку, и мы объединяем результат с str, чтобы получить полную команду, которая выполняется system().

4 голосов
/ 18 июня 2009

Я считаю, что ваш комментарий о том, что записать создание процессов не может быть странным, но если вы действительно не можете (возможно, потому что вы не знаете, сколько будет создано, и не хотите, чтобы оставьте realloc в памяти), тогда я, вероятно, открою все файлы, соответствующие глобусу /proc/[1-9]*/status, и поищу строку с надписью PPid: <num>, где <num> был мой идентификатор процесса.

1 голос
/ 18 июня 2009

Вы можете проанализировать список процессов (ps -ax?), Который включает идентификатор родительского процесса. Вероятно, это можно сделать с помощью простого сценария оболочки.

0 голосов
/ 01 июня 2017

Если вы пытаетесь получить все дочерние процессы с очень конкретной целью ожидания их завершения, вы можете использовать waitpid (-1, ...):

while (true) {
  // Wait for any child exiting
  int child_status;
  const int child_pid = waitpid(-1, &child_status, 0);
  // check child_status
}
0 голосов
/ 18 июня 2009

Если вы хотите отследить события форка и извлечь дочерние pids для целей отладки, есть несколько способов сделать это, включая:

  • Использование GDB
  • используя strace
  • Использование systemtap
  • Использование соединителей событий ядра (не уверен, что именно это)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...