Создайте дерево процессов в определенном порядке, используя fork () - PullRequest
1 голос
/ 17 апреля 2020

Я попытался создать дерево процессов в C, как показано на рисунке здесь:

enter image description here

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

Мой код:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(int argc, char **argv)
{
    pid_t b,c,d,e,f,g,h;
    if(b = fork() == 0)
    {
        if(e = fork() == 0){}
        else
        {
            if(f = fork() == 0)
            {
               sleep(1);
               if(h = fork() == 0){}
            }
        }
    }
    else
    {
        if(c = fork() == 0)
        {
            sleep(0.5);
            if(g = fork() == 0){}
        }
        else
        {
            if(d = fork() == 0){}
        }
    }
    return 0;
}

Я использовал sleep, чтобы задержать процессы, чтобы они могли быть созданы в правильном порядке. Но я думаю, что это не правильный способ сделать это, кто-нибудь может показать мне правильный и более надежный способ?

1 Ответ

1 голос
/ 17 апреля 2020

Вы правы, что использование сна не является правильным способом сделать это. Вам нужно будет использовать некоторую форму межпроцессного взаимодействия (IP C).

Я бы сказал, что самый простой способ - это использовать канал между parent-child. Он должен быть многоуровневым, чтобы поддерживать отношения между B, C и E.

Что-то вроде:

  • Каждый процесс печатает свою букву сразу после запуска
  • Каждый процесс (кроме A) затем отправляет 'ok' своему родителю
  • Каждый процесс (кроме A) затем ожидает сообщения 'go' от своего родителя.
  • Когда он получает сообщение «go», он продолжает создавать каждого из своих дочерних элементов в порядке, ожидая получения «ОК» от каждого, прежде чем создавать следующий.
  • Когда он получил «ОК» от своего последнего потомка, он затем посылает «ОК» своему родителю, если только это не А (не имеет родителя), и в этом случае он отправляет «go» каждому из своих потомков по очереди, ожидая, пока не получит «ОК». переход к следующему дочернему элементу.
  • После создания своих дочерних элементов, когда процесс получает «go» от своего родительского элемента, он по очереди отправляет «go» каждому из своих дочерних элементов, ожидая получения ». ok 'от каждого до перехода к следующему.

Это шоу Это будет большая часть решения, но не полная. Вам понадобится какая-то отделочная логика c. Я бы предложил что-то вроде

  • Когда процесс, у которого нет дочерних элементов, получает «go» от своего родителя, он отправляет «done» обратно родителю.
  • Когда процесс получает «done» от всех своих дочерних элементов, отправляет «done» своим родителям.
  • Когда процесс A получает «done» от всех своих дочерних элементов, игра заканчивается, и каждый может упакуйте и go home.

Вам понадобится лучшая структура, чем вложенная группа блоков if / else. Я предлагаю создать какую-то простую таблицу в переменной stati c в верхней части файла, чтобы отобразить, какие дочерние элементы есть у каждого узла, и установить переменную в имя процесса перед его разветвлением.

Функции очень буду вашим другом в этом упражнении.

...