Нахождение уровня дочернего процесса в дереве процессов - PullRequest
0 голосов
/ 19 февраля 2019

Я пытался создать дерево процессов с помощью fork () и распечатать уровень каждого дочернего элемента (0 для базового процесса, 1 для его дочернего элемента, 2 для его внука и т. Д.) В дереве.Код ниже работает только для глубины 0 и 1. Любая идея, как я могу улучшить это?Спасибо.

#include <stdio.h>
#include <unistd.h>
int i;
int main()
{
    pid_t baseID = getpid();
    printf("Base Process ID: %d, level: 0 \n", baseID);
    for (i = 0; i < 3; i++) {
        int level = 1;
        pid_t pid;
        pid = fork();
        if (pid == 0) {
            pid_t childID = getpid();
            pid_t parentID = getppid();
            if (parentID == baseID) {
                level = 1;
            }
            else {
                // do something for grandchildren here
                level++;
            }
            printf("Process ID: %d, Parent ID: %d, level: %d \n", getpid(), getppid(), level);
        }
        else {
            wait(NULL);
        }
    }
    return 0;
}

1 Ответ

0 голосов
/ 20 февраля 2019

Предполагаемое дерево процессов выглядит следующим образом:

0
|->1
|  |->2
|  |  |->3
|  |
|  |->2
|
|->1
|  |->2
|
|->1

Таким образом, чтобы иметь возможность печатать уровень каждого процесса, мы должны просто инициализировать переменную level в 0 снаружи основной цикл for и просто увеличивайте его значение при каждом создании дочернего процесса.

Следующий код будет печатать уровень каждого дочернего процесса, как и ожидалось:

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
  pid_t baseID = getpid();
  printf("Base Process ID: %d, level: 0 \n", baseID);

  int level = 0;

  for (int i = 0; i < 3; i++) {

    pid_t pid = fork();

    if (pid == 0) { // Child

      pid_t childID = getpid();
      pid_t parentID = getppid();

      level++;

      printf("Process ID: %d, Parent ID: %d, level: %d \n", getpid(), getppid(), level);

    } else { // Parent
      wait(NULL);
    }
  }

  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...