Програма 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 шт):
Простейший пример, вроде бы реализующий условия вашей задачи.
Без проверок на ошибки (добавьте сами, если требуются).
#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$