как запустить несколько детей с разными задачами? - PullRequest
1 голос
/ 05 мая 2020

Моя программа должна создать несколько дочерних элементов, я беру количество детей из терминала. Затем мне нужно сгруппировать их, и у каждой группы разные задачи.

Я создал детей, но проблема в том, что я не могу давать им отдельные задачи, я не могу различать guish детей. Единственное, что я могу сделать, так это то, что все дочерние элементы работают над одной и той же частью (например, печать pid).

Как я могу разделить их и дать им определенные c задачи?

Например, сначала 4 ребенка должны вызывать функцию, 3 других должны что-то печатать, а 3 других должны писать в файл et c.

    pid_t pid[10];

    pid[0] = fork();
    if(pid[0] > 0)
    {
        for(int i = 0; i < 9; i++)
        {
            if(pid[i] > 0)
            {
                pid[i + 1] = fork();
            }
        }
    }

    for(int i = 0; i < 10; i++)
    {   
        if(pid[i] == 0)
        {
            printf("child %d, parent %d\n", getpid(), getppid());
            exit(1);
        }
    }

Ответы [ 2 ]

1 голос
/ 05 мая 2020

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

Когда вы используете fork() в своем коде, знайте, что дочерний процесс продолжается с того места, где был родитель. Поэтому, когда вы вызываете fork() в первом for l oop, все дочерние процессы продолжают l oop, начатое родителем. Я не думаю, что вы ожидаете такого поведения.

В любом случае, вот возможное решение вашей проблемы. Таким образом, ваши процессы делят некоторые вещи на небольшие группы. Обратите внимание на функцию exit(0) в конце работы. Важно быть уверенным, что каждый процесс выполняет только свою работу, а не работу своего родителя:

pid_t pid[10];

for (int i = 0; i < 9; i++)
{
    pid[i] = fork();

    //First group            
    if (pid[i] == 0 && i < 4){
        //Insert here the code for the first group or call a fuction
        exit(0);
    }

    //Second group
    if (pid[i] == 0 && i >=4 && i < 8){
        //Insert here the code for the second group or call a fuction
        exit(0);
    }

    //Third group
    if (pid[i] == 0 && i >=8){
        //Insert here the code for the third group or call a fuction
        exit(0);
    }

    if (pid[i] < 0){
        perror("Something wrong with the fork");
        exit(1);
    }
}
0 голосов
/ 05 мая 2020
int flag = 0;
flag |= (fork() == 0) << 0;
flag |= (fork() == 0) << 1;
flag |= (fork() == 0) << 2;
printf("this process works on problem %d\n", flag);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...