Как найти все дочерние процессы?

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

 Duck17 июн. 2009 г., 23:31
Почему это невозможно? Это, безусловно, самый чистый и эффективный способ сделать это.
@Duck Jun: я хотел бы получить все дочерние элементы родительского процесса текущего процесса (чтобы пересечь все процессы, какps делает), и в этом случае это невозможно. Правда, в этом вопросе зависит от того, чтоmy child processes означают: дочерние элементы текущего процесса или дочерние элементы произвольного процесса, принадлежащего текущему пользователю. Больше похоже на первое в этом вопросе.
 FreeMemory18 июн. 2009 г., 16:57
Вы против написания LKM, который переопределит один из неиспользованных системных вызовов? Если это так, было бы тривиально написать небольшой системный вызов, который сделает это за вас.
 c4757p17 июн. 2009 г., 23:29
«Чистым C»; Я как бы включил «не анализировать вывод команды».
 c4757p21 июн. 2009 г., 15:42
LKM на самом деле очень хорошая идея. Я предполагаю, что я пропустил - это для программы очень низкого уровня, которая должна быть в состоянии получить эту информацию, когда она является единственной функциональной возможностью в загрузочной системе. Вот почему я не хочу называть «ps». Не совсем уверен, каково было мое отвращение к чтению / процессу; Я попробую и LKM, и read / proc и посмотрим, что работает лучше.

Ответы на вопрос(7)

Решение Вопроса

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

 01 окт. 2017 г., 10:42
не могли бы вы разработать свой ответ? Я получил ребенка определенного процесса?
 21 июл. 2009 г., 23:14
Он сказал, что хочет сделать это без чтения / proc ...
 21 июл. 2009 г., 23:24
А потом он / она принял мой ответ, так что, думаю, он / она передумал, увидев, как легко это будет.
 12 сент. 2016 г., 18:50
Одна вполне справедливая причина, по которой вы, возможно, не сможете записать создание каждого дочернего процесса: если вы знаете, что библиотека разветвляет процессы, и она не дает вам их PID.

Что-то вроде. (Надеюсь, синтаксис достаточно близок)

#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;
}


 18 июн. 2009 г., 00:09
Спасибо, хороший код.
 18 июн. 2009 г., 00:25
голосование вниз убрано. :)
 17 июн. 2009 г., 23:58
блеф, тот же ответ, что и у сангрету.
 18 июн. 2009 г., 00:02
Байрон, я проголосовал за тебя, потому что у тебя, вероятно, самый лучший ответ на вопрос, какой сейчас вопрос, когда ps не вариант. Хотя я действительно надеюсь, что вы не проголосовали за меня, потому что мой ответ такой же, как и у сангреты, с более подробной информацией. Мы были на расстоянии 2 минуты, и мне потребовалось время, чтобы написать исходный псевдокод. С тех пор я отредактировал, чтобы предоставить более подробный код, который работает.

й отладки, есть несколько способов сделать это, включая:

Using GDB using strace Using systemtap Using kernel event connectors (not sure what these are exactly)

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

 17 июн. 2009 г., 23:23
Он сказал чистый с;). Я сделал это с успехом, хотя.
 17 июн. 2009 г., 23:26
Он все еще считается чистым C, если вы выполняете команду оболочки из него?
 17 июн. 2009 г., 23:30
@sangretu Нет - даже если это оболочка Си. ;)

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

Как написано на странице руководства:

pid_t fork(void);

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

 17 июн. 2009 г., 23:51
Я предположил, что у него была веская причина. Но ты прав. Получить эту информацию обычно довольно тривиально.

#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().

 01 окт. 2017 г., 10:44
Есть лиsystem(str) показать вывод на консоли & amp; Я также хочу, чтобы все идентификаторы в массиве
 18 мая 2018 г., 21:14
Обратите внимание, чтоps -o pid --ppid также вернет свой собственный pid как последний pid в списке.

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

while (true) {
  // Wait for any child exiting
  int child_status;
  const int child_pid = waitpid(-1, &child_status, 0);
  // check child_status
}
 23 авг. 2017 г., 15:26
Я могу использовать ваше решение для отображения статуса фонового процесса в моей оболочке. Но когда разрыв цикла?

Ваш ответ на вопрос