Програма Fork в С++

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

    #include <sys/wait.h>
    #include <unistd.h>
    #include <vector>
    #include <iostream>
    #include <iomanip>
    #include <string>
    #include <array>
    #include <algorithm>
    
    int const parentRepetitions = 1;
    
    void waitAll(std::vector<pid_t> pids)
    {
        while (!pids.empty())
        {
            pid_t pid;
            if ((pid = wait(NULL)) == -1)
            {
                perror("Error waiting for a child.");
                exit(EXIT_FAILURE);
            }
            auto it = std::find(pids.begin(), pids.end(), pid);
            if (it != pids.end())
                pids.erase(it);
        }
    }
void parentProcess(std::vector<pid_t> const &children)
{
    for (int i = 0; i < parentRepetitions; ++i)
    {
        sleep(2);
        std::cout << '#' << "\n";
    }

    std::cout << "Parent start waiting for children."
              << "\n";
    waitAll(children);
    std::cout << "Parent end"
              << "\n";
}



int main(int argc, char *argv[])
{
    std::vector<int> children;
    pid_t pid;
    if ((pid = fork()) == 0)
    {
        std::string name;
        std::string surname;
        std:: cout << "Wprowadz swoje imie ";
        std::cin >> name;
        if ((pid = fork()) == 0)
        {
            std::cout << "Wprowadz swoje nazwisko ";
            std::cin >> surname;
        }
         else
        {
        // parent
        children.push_back(pid);
         }
        parentProcess(children);
        std::cout << "Hello " << name;
        std::cout << "Hello " << surname;
}
    else
    {
        // parent
        children.push_back(pid);
    }
    parentProcess(children);
    return 0;
}

В большинстве просто скопировал функции с лекций их почти не понимаю если что Вот какой я получаю вывод:

Wprowadz swoje imie #
Parent start waiting for children.
Andrii
Wprowadz swoje nazwisko #
Parent start waiting for children.
Makivnyxhuk
#
Parent start waiting for children.
Parent end
Hello AndriiHello Makivnyxhuk#
Parent start waiting for children.
Parent end
Parent end
Hello AndriiHello #
Parent start waiting for children.
Error waiting for a child.: No child processes
Parent end

Должно в результате быть так:

Wprowadz swoje imie Andrii
Parent start waiting for children.
Wprowadz swoje nazwisko makivnychuk
Hello makivnychuk
Hello Andrii
Parent end

Ответы (1 шт):

Автор решения: avp

Простейший пример, вроде бы реализующий условия вашей задачи.
Без проверок на ошибки (добавьте сами, если требуются).

#include <iostream>
#include <string.h>

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

using namespace std;

void child (pid_t p)
{
  while (p && kill(p, 0) == 0)
    usleep(1000); // second child waits when the first exited
  
  cout << "Enter name: ";
  string name;
  cin >> name;
  cout << "Hello, " << name << '\n';

  exit(0);
}

int main (int ac, char *av[]) {
  pid_t p1 = 0, p2 = 0;

  if ((p1 = fork()) == 0)
    child(0);

  // parent start child2
  if ((p2 = fork()) == 0)
    // child2
    child(p1);

  // parent (both childs do exit in child() function)
  cout << "Parent started waiting for children.\n";
  int s;
  while (wait(&s) != -1);
  cout << "Parent end\n";
}

Результат:

avp@avp-desktop:~/avp/hashcode$ g++ ttt.cpp  && ./a.out
Parent started waiting for children.
Enter name: Vova
Hello, Vova
Enter name: Vanya
Hello, Vanya
Parent end
avp@avp-desktop:~/avp/hashcode$ 
→ Ссылка